清理私人剪贴板格式

时间:2014-01-10 12:39:55

标签: windows clipboard

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

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

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

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

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

  3. 理想情况下,您只需删除私有格式,并在应用程序退出时保留任何标准格式,但我找不到API调用,只从剪贴板中删除一种格式。有没有一种简单的方法可以做到这一点,除了清空剪贴板,然后明确写回非私有格式?

  4. 我搜索了MSDN文档和Google,无法找到这些问题的答案,所以这里有人可以帮忙吗?

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

1 个答案:

答案 0 :(得分:0)

非权威性答案,但它可以指导您的测试以确定真相:

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