将剪贴板内容存储到字节数组?
Store clipboard contents to a byte array?
我正在尝试将项目作为字节数组存储在剪贴板中。
我有以下功能可以帮我做到这一点。
public static byte[] GetClipboardDataBytes(uint format)
{
var dataPointer = GetClipboardData(format);
var length = GlobalSize(dataPointer);
if(length == UIntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
var lockedMemory = GlobalLock(dataPointer);
if(lockedMemory == IntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
var buffer = new byte[(int)length];
Marshal.Copy(lockedMemory, buffer, 0, (int)length);
GlobalUnlock(dataPointer);
return buffer;
}
这适用于文件格式 (CF_HDROP
) 和文本格式(CF_TEXT
等),但不适用于 CF_BITMAP
。在那种情况下,length
是 0
,产生以下异常描述:
Win32Exception (0x80004005): The handle is invalid
我是不是做错了什么?
真的不可能制作一个通用函数,它总是可以获取剪贴板中可用的标准格式并存储它们吗?
你的尝试是不可能的。剪贴板数据不强制流式传输到字节数组。
位图就是一个很好的例子。数据不是字节数组。您可以提取 HBITMAP
但这不是字节数组。您可以将位图句柄流式传输到其 .bmp 文件表示,但这需要理解该特定格式的定制代码。
对于您的应用程序可能不知道的一般格式,您没有机会持久化到字节数组。
我正在尝试将项目作为字节数组存储在剪贴板中。
我有以下功能可以帮我做到这一点。
public static byte[] GetClipboardDataBytes(uint format)
{
var dataPointer = GetClipboardData(format);
var length = GlobalSize(dataPointer);
if(length == UIntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
var lockedMemory = GlobalLock(dataPointer);
if(lockedMemory == IntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
var buffer = new byte[(int)length];
Marshal.Copy(lockedMemory, buffer, 0, (int)length);
GlobalUnlock(dataPointer);
return buffer;
}
这适用于文件格式 (CF_HDROP
) 和文本格式(CF_TEXT
等),但不适用于 CF_BITMAP
。在那种情况下,length
是 0
,产生以下异常描述:
Win32Exception (0x80004005): The handle is invalid
我是不是做错了什么?
真的不可能制作一个通用函数,它总是可以获取剪贴板中可用的标准格式并存储它们吗?
你的尝试是不可能的。剪贴板数据不强制流式传输到字节数组。
位图就是一个很好的例子。数据不是字节数组。您可以提取 HBITMAP
但这不是字节数组。您可以将位图句柄流式传输到其 .bmp 文件表示,但这需要理解该特定格式的定制代码。
对于您的应用程序可能不知道的一般格式,您没有机会持久化到字节数组。