【问题标题】:How to get image data from Windows clipboard如何从 Windows 剪贴板中获取图像数据
【发布时间】:2019-11-16 15:31:07
【问题描述】:

我正在尝试用 Golang 编写一个程序来从 Windows 剪贴板获取图像数据。

我了解there is a plugin for getting data from Windows Clipboard,问题是它不支持图像数据,仅支持文本。基本上不是我要找的。​​p>

package main

import ("fmt"
        "github.com/atotto/clipboard"
)


func main()  {
    str,err:=clipboard.ReadAll()
    if err!=nil {
        fmt.Println(err)        
    }else {
        fmt.Println(str)
    }
}

这将输出“操作成功完成”。如果剪贴板包含图像,则会出错。

知道怎么做吗?

更新!

我尝试将CF_BITMAP 传递给GetClipboardData,它返回位图(Hbitmap)的句柄。我不熟悉处理它,但显然它是一个很长的无符号数字?

无论如何,我尝试了一些谷歌搜索来到this。使用函数GdipCreateBitmapFromHBITMAP

var Bitmap *win.GpBitmap
pBitmap := &Bitmap
fmt.Println(win.GdipCreateBitmapFromHBITMAP(win.HBITMAP(Hbitmap),0,pBitmap))

我得到一个“ok”的输出,但是位图是空的。我又被卡住了。

我应该如何存储位图?

【问题讨论】:

  • 你发现了吗?

标签: image go clipboard


【解决方案1】:

适用于仍在寻找解决方案的任何人。这是一个可以处理 UTF8 和图像剪贴板数据的活动 Go 包:

https://github.com/golang-design/clipboard

它也是跨平台的(Linux/Windows/macOS),没有额外的依赖,是上面提到的 atotto/clipboard 包的一个很好的替代品。

【讨论】:

    【解决方案2】:

    问题

    github.com/atotto/clipboard 包似乎专门针对文本操作,而且它是跨平台的,所以这就是你所得到的。

    在 Windows™ 上,包使用标准 Win32 API 来访问剪贴板。 具体来说,this statement 调用 GetClipboardData()CF_UNICODETEXT 格式参数传递给它,这就是操作成功完成的原因:它返回剪贴板包含的文本(在您的情况下 - 无,一个空字符串)。

    解决办法

    直接的解决方案是从该包中复制特定于 Windows 的代码的相关位,并将对 GetClipboardData 的调用中的参数修改为 CF_BITMAP

    一个更复杂的解决方案可能是首先对EnumClipboardFormats()进行一系列调用,并确定是否有任何图像数据(CF_BITMAP)可用,只有在可用的情况下才调用GetClipboardData

    【讨论】:

    • 感谢您回答我的问题,但将CF_BITMAP 传递给GetClipboardData 会产生另一个问题,我已在我的问题中进行了更新。可以看看吗?
    • @CSDD,事实证明这比我预期的要正确。我现在有一个半有效的解决方案;希望在几个小时内准备好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2019-12-07
    • 2015-08-13
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多