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

MxL*_*evs 6 .net c# clipboard

看看这张图片:

IMG2

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

我想自己完成这个.

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

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

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

IMG2

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

这可以在.NET中完成吗?

dlf*_*dlf 5

额外的字节是序列化标头.请参阅关于类的MSDN文档中的这个注释Clipboard(强调我的):

对象必须是可序列化的,才能将其放在剪贴板上.如果将非可序列化对象传递给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);
Run Code Online (Sandbox Code Playgroud)