如何在WinForms应用程序中创建自定义剪贴板格式

时间:2015-04-01 16:20:00

标签: c# .net clipboard

看一下这张图片:

img2

通过复制skype列表中的一个联系人生成屏幕截图。数据包含原始字节,其中包含skype显然有用的信息(在这种情况下,联系人名称以及名称的大小)。

我想自己完成这个。

这是我尝试复制到剪贴板时使用的代码

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

哪个会复制到剪贴板。但是,我得到一个DataObject条目以及一些额外的数据,而不仅仅是原始字节:

img2

上半部分是我看到的。下半部分是我截取屏幕的截图。请注意,它只是原始位图数据。

这可以在.NET中完成吗?

1 个答案:

答案 0 :(得分:5)

额外字节是序列化标头。请参阅Clipboard课程(强调我的)MSDN文档中的note

  

对象必须是可序列化的,才能将其放在剪贴板上。如果   您将一个不可序列化的对象传递给Clipboard方法,该方法   没有抛出异常就会失败。看到   System.Runtime.Serialization有关序列化的更多信息。 如果   你的目标应用程序需要一个非常具体的数据格式,   在序列化过程中添加到数据的标题可能会阻止   识别您的数据的应用程序。要保留您的数据格式,   将您的数据作为Byte数组添加到MemoryStream并传递   MemoryStream到SetData方法

所以解决方案就是这样做:

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