先看一下,从IE复制到Word(2003和2007效果是差不多的,就不上图了)里的效果:
如果从Firefox、Opera复制到Word,效果如下图(上面一段是从Opera,下面那一段是从Firefox复制的):
在运行里输入"clipbrd.exe",查看剪贴板(没有?在这里可以下载>)上的内容(上面的是IE,下面的是Firefox,有“略微的区别”):
复制数据时,注意到word的状态栏提示“连接服务器”的字样,于是拿出Wireshark,抓包分析了一下,果然(注意第四项,word发送了一个Http Get请求,请求的内容恰好是该网页的css文件,"HTTP GET /inc/ftp.css HTTP/1.1”):
显然,如果是表格数据的话,CSS一定定义了样式,于是Word自己拿了过来并解析,将表格样式显示了出来,而从别的浏览器粘贴时,却没有这一步,自然就没有样式了。
上面说到,复制到剪贴板上的数据也“略微的差别”,的确是这种差别导致了,粘贴到word时产生的不同行为。Windows中剪贴板有两种,一种是Windows标准剪贴板,一种是Ole(Object Linking and Embedding,对象链接和嵌入)剪贴板,但实际上,标准剪贴板的API接口虽然没变,但是内部实现实际上已经使用Ole数据传输机制来实现了。Ole支持UDT(Uniform Data Transfer,统一数据传输),并可以通过拖放操作实现剪贴板的剪切、复制和粘贴等操作。OLE剪贴板除了拥有标准Windows剪贴板的性能外,还支持传输用户自定义的剪贴板格式,并能够在传输数据时绑定OLE格式(如字体、字号等)。
所以从IE复制数据时,使用的是Ole剪贴板,绑定了Ole格式,而格式的来源又是在网络上的css文件,所以word才会去获取这个css文件。微软的word、excel、ie等都可以被称作OLE文档包容器,粘贴时自然能够识别到Ole格式的数据。而别的浏览器复制的时候并没有这种Ole格式,自然粘贴时只是纯文本了。如果是Ole格式的数据,但是粘贴时不时Ole容器,比如记事本,就会当作普通的文本复制。这就是为什么有人喜欢先把网页上的内容先粘贴到记事本,清楚掉格式,然后再复制到Word中的原因。
如果想了解更多关于:OLE(对象连接和嵌入),UDT(统一数据传输)可以参考《COM本质论》、《Visual C++技术内幕》 。
如何使用Ole剪贴板进行编程可以参考MSDN:
http://msdn.microsoft.com/en-us/library/6www2be1(VS.80).aspx
http://support.microsoft.com/kb/83659/zh-cn