C# 是否将剪贴板内容存储到字节数组?
我试图将项目作为字节数组存储在剪贴板中 我有下面的函数为我做这件事C# 是否将剪贴板内容存储到字节数组?,c#,c++,pinvoke,clipboard,C#,C++,Pinvoke,Clipboard,我试图将项目作为字节数组存储在剪贴板中 我有下面的函数为我做这件事 public static byte[] GetClipboardDataBytes(uint format) { var dataPointer = GetClipboardData(format); var length = GlobalSize(dataPointer); if(length == UIntPtr.Zero) { throw new Win32Excepti
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\u HDROP
)和文本格式(CF\u text
等),但不适用于CF\u位图
。在这种情况下,length
为0
,产生以下异常描述:
Win32异常(0x80004005):句柄无效
我做错什么了吗
是否真的不可能创建一个通用函数,该函数始终可以获取剪贴板中可用的标准格式并存储它们?您所尝试的是不可能的。剪贴板数据不强制流式传输到字节数组 位图就是一个很好的例子。数据不是字节数组。您可以提取
HBITMAP
,但这不是字节数组。您可以将位图句柄流式处理为其.bmp文件表示形式,但这需要了解特定格式的定制代码
对于应用程序可能不了解的常规格式,您没有机会坚持使用字节数组 您使用的
Marshal.GetExceptionForHR
错误GetLastWin32Error
不返回HRESULT。只需使用抛出新的Win32Exception()代码>。剪贴板不是可以从.net访问吗?谢谢@illidans4。我纠正了我的问题。我还添加了更多关于发生了什么的细节。是的@aron,但即便如此,无论数据具有何种结构(在标准格式中),都不可能以字节数组的形式获取数据。它不适用于所有其他格式。就是你试过的,很有趣。然后让我们来玩玩这个想法,我提取剪贴板中的任何内容,然后在10分钟后再次注入完全相同的数据。即使它是一个HBITMAP
,它会起作用吗?我正在构建一个剪贴板管理器,这就是我问的原因。答案是正确的,但实际上,位图并不是一个很好的例子:大多数应用程序将它作为独立于设备的位图字节流以及标准位图类型放在剪贴板上,通常也作为PNG字节流放在剪贴板上。当然,它们有自己的数据类型标识符。对于实际的标准“位图”格式,这是100%正确的。问题是关于CF_BITMAPDavid的。你能回答我的第一条评论吗?简单回答该评论中的问题。不