2015-04-01 61 views
6

自定義的剪貼板格式這個圖片請看:通過複製在你的Skype列表中的聯繫人中的一個產生如何創建一個WinForms應用程序

img2

截圖。該數據包含原始字節,其中包含skype顯然有用的信息(在這種情況下,聯繫人姓名以及名稱的大小)。

我想自己做到這一點。

這是我在試圖用來複制代碼到剪貼板

byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; 
Clipboard.SetData("My Data", bytes); 

這也複製到剪貼板。不過,我得到一個數據對象的條目與添加到它,而不僅僅是原始字節一些額外數據一起:

img2

上半部分是我所看到的。下半部分是我截屏的時候。請注意,它只是原始位圖數據。

這可以在.NET中完成嗎?

+1

請參閱:https://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.setdata(v = vs.110).aspx SetData方法需要的格式,但它似乎你餵它「我的數據」,這似乎不是一個正確的格式。我想你可能想要使用SetDataObject,如果數據格式將是未知的。 – Hozikimaru 2015-04-01 16:41:11

+1

我在DataFormats頁面的底部看不到這句話:'在這個類的靜態列表中添加一個新的格式名稱/ ID號對,並在通過它時將Windows註冊表的格式註冊爲剪貼板格式格式名稱。「我會研究這個,看看如何將其註冊爲格式。 – MxyL 2015-04-01 16:58:05

+1

您已獲得自定義格式。這是正確的格式,任何應用程序訪問剪貼板都可以安全地檢索它。如果有任何不匹配,自動加載所需的組件並提供診斷。原始字節當然無法實現,完全沒有意義。 – 2015-04-01 17:45:03

回答

4

額外的字節是序列化標題。從上Clipboard類(重點煤礦)的MSDN文檔請參閱本note

的對象必須是可序列爲它在剪貼板上付諸表決。如果 您將不可序列化的對象傳遞給剪貼板方法,則方法 將失敗而不會引發異常。有關序列化的更多信息,請參閱 System.Runtime.Serialization。 如果 您的目標應用程序需要非常特定的數據格式,則在序列化過程中添加到數據中的 標頭可能會阻止應用程序識別您的數據。爲了保留您的數據格式, 將您的數據作爲字節數組添加到MemoryStream,並將MemoryStream傳遞給SetData方法

所以解決的辦法是要做到這一點:

byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; 
MemoryStream stream = new MemoryStream(bytes); 
Clipboard.SetData("My Data", stream); 
相關問題