2014-01-10 31 views
2

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

  1. 它应该在逻辑上是真实的,一个应用程序使用一个专用的格式不会被任何其他应用程序(即使他们使用私营范围相同的格式代码)可以看出。

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

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

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

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

我搜索了MSDN文档和Google,找不到这些问题的答案,所以任何人都可以帮忙吗?

(我知道注册剪贴板格式我不要求那些。)

+0

如果一个应用程序使用相同的名称,您确定没有看到其他剪贴板格式的应用程序吗?我可以使用私有格式在同一应用程序的两个实例之间拖放。没有看到为什么这不适用于2种不同应用的原因。 – user2543253

+0

@ user2543253我假设你的意思是'如果他们使用相同的_number_';私人剪贴板格式没有名称。问题是,如果私人剪贴板格式数字在所有应用程序之间共享,那么必须有一些专用格式的中央注册表,以防止两个应用程序使用相同的数字来处理不同的事情。然后他们不再是私人格式,而是像CF_TEXT这样的公共文件格式。您是否使用注册剪贴板格式混淆了它们? –

+0

注册“RegisterClipboardFormat”时,我的意思是相同的名称。因为那时他们得到相同的号码。重新阅读文档,我发现:“这使得多个应用程序可以使用相同的注册剪贴板格式来复制和粘贴数据”。你是什​​么意思“混淆注册格式”?是不是剪贴板格式我注册自己的私人格式? – user2543253

回答

0

非权威的答案,但它可以引导你的测试,以确定真相:

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