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

How to get image data from Windows clipboard

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

我明白there is a plugin for getting data from Windows Clipboard,问题是它不支持图像数据,只有文本。基本上不是我要找的。

package main

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


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

如果剪贴板包含图像,这将输出 "The operation completed successfully." 错误。

知道怎么做吗?

更新!:

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

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

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

我得到了 "ok" 输出,但是位图是空的。我又卡住了。

我应该如何存储位图?

问题

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

在 Windows™ 上,程序包使用标准 Win32 API 访问剪贴板。 具体来说,this statement calls GetClipboardData() passing it the CF_UNICODETEXT 格式参数,这就是操作成功完成的原因:它 returns 剪贴板包含的文本(在您的情况下 - none,一个空字符串)。

解决方案

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

一个更复杂的解决方案可能是首先执行对 EnumClipboardFormats() 的一系列调用并确定是否有任何图像数据 (CF_BITMAP) 可用,然后仅在就是这样。

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

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

它也是跨平台的 (Linux/Windows/macOS),没有额外的依赖项,可以很好地替代提到的 atotto/clipboard 包。