[英]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_BITMAP或CF_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_PRIVATEFIRST和CF_PRIVATELAST之间的一种 ,或者可能是其他类型)将在剪贴板上,我的程序在调用GlobalLock()
后会再次崩溃。 但由于似乎没有太多文档解释备份剪贴板的最佳方法,并且很明显GlobalLock()
不能正常处理所有数据类型(不幸的是),我不知道如何处理这些情况。 是否可以安全地假设所有其他格式 - 除了前一个URL中列出的格式,不被GlobalFree()
释放 - 可以使用GlobalLock()
“抓取”?
有任何想法吗?
这是愚蠢的,因为你无法100%备份/恢复剪贴板。 许多应用程序使用延迟渲染,数据实际上不在剪贴板上。 当您请求粘贴时,它们会收到通知并生成数据。 对于来自Excel等应用程序的大量数据,这将需要几分钟和几百MB。 从Excel复制时,请查看剪贴板上列出的格式数。 将有二十多个,包括Bitmap,Metafile,HTML。 如果在Excel中选择255x25000单元格并复制它,您认为会发生什么? 该位图有多大? 提示:在尝试此操作之前保存所有打开的文档,因为您可能需要重新启动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.