【发布时间】:2015-08-31 16:26:19
【问题描述】:
我正在尝试将剪贴板中的项目存储为字节数组。
我有以下功能可以为我做这件事。
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):句柄无效
我是不是做错了什么?
难道真的不能做一个通用函数,总是可以获取剪贴板中可用的标准格式并存储它们吗?
【问题讨论】:
-
你用错了
Marshal.GetExceptionForHR。GetLastWin32Error不返回 HRESULT。只需使用throw new Win32Exception();。 -
剪贴板不能从 .net 访问吗? stackoverflow.com/a/899361/1808494
-
谢谢@illidans4。我纠正了我的问题。我还添加了有关发生情况的更多详细信息。
-
是的@aron,但即便如此,无论它具有哪种结构(在标准格式中),一般都无法将数据作为字节数组获取。
-
它不适用于所有其他格式。只是您尝试过的那些。