Skip to content

Instantly share code, notes, and snippets.

@obonyojimmy
Created January 1, 2017 02:50
Show Gist options
  • Star 33 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save obonyojimmy/d6b263212a011ac7682ac738b7fb4c70 to your computer and use it in GitHub Desktop.
Save obonyojimmy/d6b263212a011ac7682ac738b7fb4c70 to your computer and use it in GitHub Desktop.
Go lang get current foreground window
package main
import (
"fmt"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
)
var (
mod = windows.NewLazyDLL("user32.dll")
procGetWindowText = mod.NewProc("GetWindowTextW")
procGetWindowTextLength = mod.NewProc("GetWindowTextLengthW")
)
type (
HANDLE uintptr
HWND HANDLE
)
func GetWindowTextLength(hwnd HWND) int {
ret, _, _ := procGetWindowTextLength.Call(
uintptr(hwnd))
return int(ret)
}
func GetWindowText(hwnd HWND) string {
textLen := GetWindowTextLength(hwnd) + 1
buf := make([]uint16, textLen)
procGetWindowText.Call(
uintptr(hwnd),
uintptr(unsafe.Pointer(&buf[0])),
uintptr(textLen))
return syscall.UTF16ToString(buf)
}
func getWindow(funcName string) uintptr {
proc := mod.NewProc(funcName)
hwnd, _, _ := proc.Call()
return hwnd
}
func main() {
for {
if hwnd := getWindow("GetForegroundWindow") ; hwnd != 0 {
text := GetWindowText(HWND(hwnd))
fmt.Println("window :", text, "# hwnd:", hwnd)
}
}
}
@kiselev-nikolay
Copy link

Cool, thanks a lot! 👏

@sgx-wb
Copy link

sgx-wb commented Aug 10, 2023

Do you have a mac version?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment