将剪贴板内容存储到字节数组?

时间:2015-08-31 16:26:19

标签: c# c++ pinvoke clipboard

我正在尝试将项目作为字节数组存储在剪贴板中。

我有以下功能可以帮我这么做。

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。在这种情况下,length0,产生以下异常描述:

  

Win32Exception(0x80004005):句柄无效

我做错了吗?

是否真的不可能制作一个通用函数,它总能获取剪贴板中可用的标准格式并存储它们?

1 个答案:

答案 0 :(得分:1)

你所尝试的是不可能的。剪贴板数据不会被强制流式传输到字节数组。

位图就是一个很好的例子。数据不是字节数组。您可以提取HBITMAP,但这不是字节数组。您可以将位图句柄流式传输到其.bmp文件表示,但这需要了解特定格式的定制代码。

对于应用程序可能不知道的一般格式,您没有机会坚持使用字节数组。