說實話真的沒辦法,剪切板是個很坑人的東西,它對於放進去的東西就是一次性,如果你想放進去一張圖片,然后再塞一張,這是不可能的,但是如果對於不同格式,比如一個是圖片格式,一個是文本格式,它是可以放多個不同格式的。
這段時間我也是一直在研究如何來解決這個問題,可是得出來的結論就是:對於你想要將多個圖片放在剪切板就只能自己新定義一個剪切板的格式,然后自己識別它,不要妄想其他人能夠懂你的東西,不太現實,所以這種東西,就是你自己定義,你自己用的,當然其他的軟件也是,對於這樣的都是自己的定義,所以你想要支持他們的,就只能去拿人家的定義來自己解釋出來。
比如說 office 這個東西我就研究了很久,雖然沒得出最后如何處理的方法,還是留下一些我的研究成果,幫助下。從office復制出兩個圖片時,它會扔出16個消息,先說這些消息是如何拿到的。
UINT format = 0; char szFormatName[80]; LPCSTR lpFormatName; while (format = ::EnumClipboardFormats(format)) { }
這樣format 就是儲存在剪切板中的格式。這些就是正常的格式,那么不正常的,也就是別人隨便定義該怎么辦呢。
提供了其他的方法:
1 while (format = ::EnumClipboardFormats(format)) 2 { 3 int iformat = ::GetClipboardFormatNameA(format, szFormatName, 4 sizeof(szFormatName)); 5 lpFormatName = szFormatName; 6 }
這里的iformat 就是隨便定義的格式,GetClipboradFormatNameA 這個方法很重要,它會拿出不是正常的系統類型,要是正常的類型時會返回0,也就是iformat會等於0,而且要視情況使用,當初我就是用GetClipboradFormatName 得不到數據,這個lpFormatName 就是用來存儲對應的指針,數據應該就是從這里拿出去。
再說說 office的那個兩張圖片的數據格式:(負值是我自己寫上,用來區分自己定義和系統定義的)
類型名 | 類型整型值 | 系統新類型名 |
DataObject | 10 | |
Object Descriptor | 17 | |
Rich Text Format | 16 | |
HTML Format | 11 | |
HTML Format | -13 | CF_UNICODETEXT |
HTML Format | -14 | CF_ENHMETAFILE |
HTML Format | -3 | CF_METAFILEPICT |
Embed Source | 12 | |
Native | 6 | |
OwnerLink | 9 | |
Link Source | 11 | |
Link Source Descriptor | 22 | |
objectLink | 10 | |
Hyperlink | 9 | |
Ole Private Data | 16 | |
Ole Private Data | -16 | CF_LOCALE |
Ole private Data | -7 | CF_OEMTEXT |
這就是office 給出來的格式,我大概也就到這步了,我是不知道該用什么樣的辦法,來將他們中的圖片格式顯示出來,要研究出來可能要更久,暫時放棄了,如果有什么新的辦法可以留言的。
提供一些剪切板操作的參考網站:(太多了,我就貼個圖,自己Google 或者百度)