2014-01-10 92 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消息時未呈現的延遲呈現數據。