如何从 Windows 剪贴板获取图像数据

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

我知道有一个插件可以从 Windows 剪贴板获取数据,问题是它不支持图像数据,仅支持文本。基本上不是我想要的。

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_BITMAPGetClipboardData,它返回位图(Hbitmap)的句柄。我不熟悉处理这个问题,但显然它是一个很长的无符号数字?

使用该功能GdipCreateBitmapFromHBITMAP

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

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

我应该如何存储位图?


HUX布斯
浏览 135回答 2
2回答

皈依舞

对于仍在寻找解决方案的任何人。这是一个可以处理 UTF8 和图像剪贴板数据的活动 Go 包:https://github.com/golang-design/clipboard它也是跨平台的(Linux/Windows/macOS),无需额外的依赖项,这是前面提到的 atotto/clipboard 包的一个很好的替代品。

潇湘沐

问题该github.com/atotto/clipboard软件包似乎专门针对文本操作,并且它是跨平台的,所以这就是您所得到的。在 Windows™ 上,该包使用标准 Win32 API 来访问剪贴板。具体来说,此语句调用GetClipboardData()向其传递CF_UNICODETEXT格式参数,这就是操作成功完成的原因:它返回剪贴板包含的文本(在您的情况下,无,一个空字符串)。解决方案GetClipboardData最简单的解决方案是从该包中复制 Windows 特定代码的相关位,并修改对to的调用中的参数CF_BITMAP。更复杂的解决方案可能是首先执行一系列调用EnumClipboardFormats()并确定是否有任何图像数据 ( CF_BITMAP) 可用,并且GetClipboardData仅在可用的情况下调用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go