如何从 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 包。
我正在尝试用 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 包。