My first SO question :-) I wish to take a screenshot from Golang by calling into User32.dll and GDI32.dll on a windows machine (project requirement).
I have a handle to the bitmap containing screenshot pixels. However, I don't know how to access its data or how to save it to disk. Anyone know how to map GDI bitmap to Golang []byte and then save as a JPG or 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))
}
You could just use the screenshot library by vova616, or take a look at the screenshot_windows.go for the required conversion method.
As per the provided example:
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()
}