如何在剪贴板中复制二进制数据?例如,如果我将数字 1 打包为 4 字节的小端整数,则希望我的剪贴板显示 00 00 00 01
。
对于文本数据,这很简单,可以选择使用 Unicode 文本或 ASCII 文本。
Clipboard.SetData(DataFormats.Text, "Some text");
Clipboard.SetData(DataFormats.UnicodeText, "赤");
然而,对于二进制数据,我不知道该怎么办。
typeof(Byte[])
。事实上,对于任何可序列化类型(您可以使用[Serializable]
属性使自己的类可序列化),都适用此方法。public void PutBytesOnClipboardObj(Byte[] byteArr)
{
DataObject data = new DataObject();
// Can technically just be written as "SetData(byteArr)", but this is more clear.
data.SetData(typeof(Byte[]), byteArr);
// The 'copy=true' argument means the data will remain available
// after the program is closed.
Clipboard.SetDataObject(data, true);
}
从剪贴板检索:
public byte[] GetBytesFromClipboardObj()
{
DataObject retrievedData = Clipboard.GetDataObject() as DataObject;
if (retrievedData == null || !retrievedData.GetDataPresent(typeof(Byte[])))
return null;
return retrievedData.GetData(typeof(Byte[])) as Byte[];
}
DataFormats
列表中没有特定类型,但由于列出的数据格式只是字符串,您可以自己编造。在下面的示例中,我使用了"rawbinary"。
放入剪贴板:
public void PutBytesOnClipboardRaw(Byte[] byteArr)
{
DataObject data = new DataObject();
using (MemoryStream memStream = new MemoryStream())
{
memStream.Write(byteArr, 0, byteArr.Length);
data.SetData("rawbinary", false, memStream);
// The 'copy=true' argument means the MemoryStream
// can be safely disposed after the operation.
Clipboard.SetDataObject(data, true);
}
}
从剪贴板中检索:
public Byte[] GetBytesFromClipboardRaw()
{
DataObject retrievedData = Clipboard.GetDataObject() as DataObject;
if (retrievedData == null || !retrievedData.GetDataPresent("rawbinary", false))
return null;
MemoryStream byteStream = retrievedData.GetData("rawbinary", false) as MemoryStream;
if (byteStream == null)
return null;
return byteStream.ToArray();
}