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

标签 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): The handle is invalid

我做错了什么吗?

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

最佳答案

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

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

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

关于c# - 将剪贴板内容存储到字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315756/

相关文章:

c++ - 在 Buck 中,如何使用 genrule 的输出作为 cxx_library 的 header ?

c# - 将不可 Blittable 结构从 C# 编码到 C++

c# - 如何正确检测主题窗口的角半径

c# - 包装 C++ 对象以用于 C# PInvoke 时的析构函数执行

c# - 无法使用 iTextSharp 填写 PDF 中的表单域

c# - 如何像在网页中一样在WPF中展开和折叠

c# - Visual Studio 2015 中的类库项目

c++ - 在我的代码中添加了一个for循环,它似乎运行得更快,这怎么可能?

c# - 如何动态加载程序集到当前应用程序域到c#项目?

c++ - 如何使用 MinGW gdb 调试器在 Windows 中调试 C++ 程序?