windows - 清理私有(private)剪贴板格式

标签 windows clipboard

当应用程序以私有(private)格式(CF_PRIVATEFIRSTCF_PRIVATELAST)将数据放在剪贴板上时,它必须释放它以响应 WM_DESTROYCLIPBOARD,因为对于这些格式,系统不会自动执行。

  1. 从逻辑上讲,一个应用程序使用的私有(private)格式不会被任何其他应用程序看到(即使它们在私有(private)范围内使用相同的格式代码)。

    a) 系统如何执行此操作?它是否使用剪贴板所有者(窗口句柄)?

    b) 当所有者窗口关闭时,私有(private)格式项目是否会自动从剪贴板中删除? (使用剪贴板查看器似乎没有。)那么当窗口句柄被重用时会发生什么?

  2. 除了响应 WM_DESTROYCLIPBOARD 释放内存外,是否还需要在应用程序退出时释放内存? (我知道剪贴板使用全局内存,因此可以从任何进程访问数据,所以我猜它不会在创建它的进程退出时自动释放。)

  3. 理想情况下,当应用程序退出时,您应该只删除私有(private)格式并保留任何标准格式,但我找不到 API 调用来仅从剪贴板中删除一种格式。除了清空剪贴板然后显式写回非私有(private)格式之外,是否有一种简单的方法可以做到这一点?

我已经搜索了 MSDN 文档和 Google,但找不到这些问题的答案,所以这里的任何人都可以提供帮助吗?

(我知道注册的剪贴板格式。我不是问那些。)

最佳答案

非权威答案,但可以指导你测试判断真假:

  1. 我认为与 SetClipboardData 的文档相反当使用私有(private)格式时,所传递句柄的内存所有权不会授予系统。因此,任何其他试图读取剪贴板的程序都将获得它无法读取的数据的句柄。测试:您的剪贴板查看器是否真的可以检索私有(private)数据,或者只是句柄?
  2. 我相信您应该释放的内存是您在调用 SetClipboardData 时引用的您自己的应用程序内存。因此,您不需要在应用程序退出时释放内存,因为它应该与剩余内存一起释放。
  3. 私有(private)格式将指向不再存在的数据,类似于在收到 WM_RENDERALLFORMATS 消息时未呈现的延迟呈现数据。

关于windows - 清理私有(private)剪贴板格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044644/

相关文章:

windows %PATH% 变量 - 如何在 CMD shell 中再次拆分 ';'

windows - 什么 SCM 在 Windows 和 Linux 下支持符号链接(symbolic link)?

linux - 重定向和服务器迁移 Windows -> Linux

delphi - 如何在剪贴板上同时创建图片和 HTML 格式?

javascript - 使用 javascript ZeroClipboard 2.2 复制到剪贴板

c++ - 即使当前正在运行全屏应用程序,如何显示通知?

C# EventLog 无法访问的日志

java - 使用java从illustrator中获取剪贴板内容

linux - 在终端 session 中复制/粘贴

java - 如何使用java将日语编码文本(Unicode类型除外)复制到剪贴板?