我的第一个问题:-)我希望通过在Windows机器上调用User32.dll和GDI32.dll来获取Golang的截图(项目要求)。
我有一个包含屏幕截图像素的位图句柄。但是,我不知道如何访问其数据或如何将其保存到磁盘。任何人都知道如何将GDI位图映射到Golang []字节,然后保存为JPG或PNG?
package main
import "syscall"
var (
user32 = syscall.NewLazyDLL("user32.dll")
procGetClientRect = user32.NewProc("GetClientRect")
// etc...
gdi32 = syscall.NewLazyDLL("gdi32.dll")
procCreateDC = gdi32.NewProc("CreateDC")
SRCCOPY uint = 13369376
//etc...
)
//
// omitted for brevity
//
func TakeDesktopScreenshotViaWinAPI() {
// these are all calls to user32.dll or gdi32.dll
hDesktop := GetDesktopWindow()
desktopRect := GetClientRect(hDesktop)
width := int(desktopRect.Right - desktopRect.Left)
height := int(desktopRect.Bottom - desktopRect.Top)
// create device contexts
srcDC := GetDC(hDesktop)
targetDC := CreateCompatibleDC(srcDC)
// create bitmap to copy to
hBitmap := CreateCompatibleBitmap(targetDC, width, height)
// select the bitmap into target DC
hOldSelection := SelectObject(targetDC, HGDIOBJ(hBitmap))
//bit block transfer from src to target
BitBlt(targetDC, 0, 0, width, height, srcDC, 0, 0, SRCCOPY)
// how to save the the data in
// *hBitmap ???
// restore selection
SelectObject(targetDC, hOldSelection)
// clean up
DeleteDC(HDC(targetDC))
ReleaseDC(hDesktop, srcDC)
DeleteObject(HGDIOBJ(hBitmap))
}
答案 0 :(得分:2)
您可以通过vova616使用the screenshot library,或者查看screenshot_windows.go以获取所需的转化方法。
根据提供的示例:
package main
import (
"github.com/vova616/screenshot"
"image/png"
"os"
)
func main() {
img, err := screenshot.CaptureScreen()
if err != nil {
panic(err)
}
f, err := os.Create("./ss.png")
if err != nil {
panic(err)
}
err = png.Encode(f, img)
if err != nil {
panic(err)
}
f.Close()
}