【问题标题】:Store clipboard contents to a byte array?将剪贴板内容存储到字节数组?
【发布时间】: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,但即便如此,无论它具有哪种结构(在标准格式中),一般都无法将数据作为字节数组获取。
  • 它不适用于所有其他格式。只是您尝试过的那些。

标签: c# c++ pinvoke clipboard


【解决方案1】:

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

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

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

【讨论】:

  • 有趣。然后让我们尝试一下,我提取剪贴板中的任何内容,然后在 10 分钟后再次注入该 exact 相同的数据。即使是HBITMAP,那会起作用吗?我正在构建一个剪贴板管理器,这就是我问的原因。
  • 答案是正确的,但实际上,位图并不是一个很好的例子:大多数应用程序将它作为设备独立位图字节流以及标准位图类型放在剪贴板上,并且通常作为PNG字节流也是如此。当然,这些都有自己的数据类型标识符。对于实际的标准“位图”格式,这是 100% 正确的。
  • 问题是关于 CF_BITMAP
  • 大卫你能回复我的第一条评论吗?
  • 对该评论中问题的简单回答。没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多