Windows Golang / GetForegroundWindow

Author Edode
Platform Windows
Language Golang
Technique GetForegroundWindow

Code

package main

import (
	"fmt"
	"golang.org/x/sys/windows"
	"syscall"
	"unsafe"
)

var (
	user32 = windows.NewLazySystemDLL("user32.dll")
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtextw
	procGetWindowText = user32.NewProc("GetWindowTextW")
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtextlengthw
	procGetWindowTextL = user32.NewProc("GetWindowTextLengthW")
)

func getWindowTextLength(windowHandle windows.HWND) int {
	ret, _, _ := procGetWindowTextL.Call(uintptr(windowHandle))

	return int(ret)
}

func getWindowName(fg windows.HWND) string {
	// +1 to get the last character of the string
	var titleBarFullLen = int(getWindowTextLength(fg)) + 1

	buf := make([]uint16, titleBarFullLen)
	procGetWindowText.Call(
		uintptr(fg),
		uintptr(unsafe.Pointer(&buf[0])),
		uintptr(titleBarFullLen))

	return syscall.UTF16ToString(buf)
}

func main() {
	var foregroundWindowHandle windows.HWND = windows.GetForegroundWindow()
	var windowName string = getWindowName(foregroundWindowHandle)

	fmt.Println("Foreground window handle: ", foregroundWindowHandle)
	fmt.Println("Window name: ", windowName)
}

Created

April 26, 2023

Last Revised

April 22, 2024