簡體   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