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

How to create a custom clipboard format in a WinForms app

看看这张图片:

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

我想自己完成。

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

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

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

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

这可以在 .NET 中完成吗?

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

An object must be serializable for it to be put on the Clipboard. If you pass a non-serializable object to a Clipboard method, the method will fail without throwing an exception. See System.Runtime.Serialization for more information on serialization. If your target application requires a very specific data format, the headers added to the data in the serialization process may prevent the application from recognizing your data. To preserve your data format, add your data as a Byte array to a MemoryStream and pass the MemoryStream to the SetData method.

所以解决方案是这样做:

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