说实话真的没办法,剪切板是个很坑人的东西,它对于放进去的东西就是一次性,如果你想放进去一张图片,然后再塞一张,这是不可能的,但是如果对于不同格式,比如一个是图片格式,一个是文本格式,它是可以放多个不同格式的。
这段时间我也是一直在研究如何来解决这个问题,可是得出来的结论就是:对于你想要将多个图片放在剪切板就只能自己新定义一个剪切板的格式,然后自己识别它,不要妄想其他人能够懂你的东西,不太现实,所以这种东西,就是你自己定义,你自己用的,当然其他的软件也是,对于这样的都是自己的定义,所以你想要支持他们的,就只能去拿人家的定义来自己解释出来。
比如说 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 或者百度)
最新评论