繁体   English   中英

如何安全正确地创建Windows剪贴板的备份?

[英]How do I safely and correctly create a backup of the Windows clipboard?

我正在尝试创建Windows剪贴板的备份。 基本上我正在做的是使用EnumClipboardFormats()来获取当前剪贴板上存在的所有格式,然后对于每种格式,我调用GetClipboardData(format)

备份数据的一部分显然涉及重复数据。 ) on the data returned by GetClipboardData() , then I fetch the size of the data by calling GlobalSize() , and then finally I do a memcpy() to duplicate the data. 我这样做是通过调用GlobalLock() )对GetClipboardData()返回的数据,然后我获取数据的大小调用GlobalSize() ,最后我做一个memcpy()来复制数据。 然后,当我完成时,我当然会调用GlobalUnlock()

嗯,这很有用......大多数时候。 如果剪贴板包含格式为CF_BITMAPCF_METAFILEPICT的数据,我的程序将在GlobalLock()崩溃。 在阅读了这篇Old New Thing博客文章( http://blogs.msdn.com/b/oldnewthing/archive/2007/10/26/5681471.aspx )后,我发现了崩溃发生的原因:显然不是剪贴板上的所有数据使用GlobalAlloc() (例如CF_BITMAP数据)分配,因此对该数据调用GlobalLock()会导致崩溃。

我遇到了这篇MSDN文章( http://msdn.microsoft.com/en-us/library/ms649014#_win32_Memory_and_the_Clipboard ),它给出了一个剪贴板格式列表以及它们如何被系统释放。 所以我所做的是将所有剪贴板格式( CF_ * )硬编码到我的程序中,系统没有通过GlobalFree()函数释放,我只是不备份这些格式; 我跳过它们。

实际上,这种解决方法似乎运作良好。 即使位图放在剪贴板上,或“特殊”数据(例如从Excel复制到剪贴板的行),我的剪贴板备份功能也能正常运行,而且我没有遇到任何崩溃。 此外,即使剪贴板上有位图并且我在备份期间跳过一些格式(如CF_BITMAP ),我仍然可以在恢复剪贴板备份后按Ctrl + V从剪贴板粘贴原始复制的位图,因为位图由剪贴板上的其他格式也不会导致我的程序崩溃( CF_DIB )。

但是,这是最好的解决方法。 我担心的是,其中一种奇怪的格式(可能是私有格式,即CF_PRIVATEFIRSTCF_PRIVATELAST之间的一种 ,或者可能是其他类型)将在剪贴板上,我的程序在调用GlobalLock()后会再次崩溃。 但由于似乎没有太多文档解释备份剪贴板的最佳方法,并且很明显GlobalLock() 不能正常处理所有数据类型(不幸的是),我不知道如何处理这些情况。 是否可以安全地假设所有其他格式 - 除了前一个URL中列出的格式,不被GlobalFree()释放 - 可以使用GlobalLock() “抓取”?

有任何想法吗?

这是愚蠢的,因为你无法100%备份/恢复剪贴板。 许多应用程序使用延迟渲染,数据实际上不在剪贴板上。 当您请求粘贴时,它们会收到通知并生成数据。 对于来自Excel等应用程序的大量数据,这将需要几分钟和几百MB。 从Excel复制时,请查看剪贴板上列出的格式数。 将有二十多个,包括Bitmap,Metafile,HTML。 如果在Excel中选择255x25000单元格并复制它,您认为会发生什么? 该位图有多大? 提示:在尝试此操作之前保存所有打开的文档,因为您可能需要重新启动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM