Как в языке Go получить список текущих открытых окон в операционной системе Windows?

Как можно получить текущие открытые окна в формате map или среза?
  • 29 октября 2024 г. 16:42
Ответы на вопрос 2
Чтобы получить список текущих открытых окон в операционной системе Windows на языке Go, вы можете воспользоваться стандартным API для работы с окнами, используя пакет `syscall` и `golang.org/x/sys/windows`. В частности, вам нужно будет использовать функцию `EnumWindows` для перебора всех окон и извлечения их заголовков.

Вот пример, который показывает, как это можно сделать:

```go
package main

import (
	"fmt"
	"syscall"
	"unsafe"

	"golang.org/x/sys/windows"
)

var (
	user32           = windows.NewLazySystemDLL("user32.dll")
	procEnumWindows  = user32.NewProc("EnumWindows")
	procGetWindowText = user32.NewProc("GetWindowTextW")
	procGetWindowTextLength = user32.NewProc("GetWindowTextLengthW")
)

type Window struct {
	HWND     windows.Handle
	Title    string
}

var openWindows []Window

func enumWindows(hwnd windows.Handle, lParam uintptr) uintptr {
	titleLen, _, _ := procGetWindowTextLength.Call(uintptr(hwnd))
	if titleLen == 0 {
		return 1
	}

	buf := make([]uint16, titleLen+1)
	procGetWindowText.Call(uintptr(hwnd), uintptr(unsafe.Pointer(&buf[0])), titleLen+1)

	title := windows.UTF16ToString(buf)
	if title != "" {
		openWindows = append(openWindows, Window{hwnd, title})
	}

	return 1
}

func getOpenWindows() []Window {
	openWindows = []Window{}
	procEnumWindows.Call(syscall.NewCallback(enumWindows), 0)
	return openWindows
}

func main() {
	windowsList := getOpenWindows()
	for _, window := range windowsList {
		fmt.Printf("HWND: %v, Title: %s\n", window.HWND, window.Title)
	}
}
```

### Объяснение кода:
1. Мы создаем переменные для работы с библиотекой `user32.dll`, загружаем необходимые функции.
2. Определяем структуру `Window`, которая хранит дескриптор окна и его заголовок.
3. Реализуем функцию `enumWindows`, которую мы передаем в `EnumWindows`. Эта функция будет вызываться для каждого окна, и внутри нее мы захватываем заголовок окна.
4. Функция `getOpenWindows` инициализирует срез `openWindows` и вызывает `EnumWindows`.
5. В `main` мы получаем список открытых окон и выводим его на экран.

### Запуск:
Для запуска этого кода на вашем компьютере вам нужно установить пакет `golang.org/x/sys/windows`. Это можно сделать с помощью команды:
```bash
go get golang.org/x/sys/windows
```

Этот код будет работать только наWindows. Обратите внимание, что вам может понадобиться добавить проверки ошибок для более надежного кода.
Документация -> Win32 -> API -> Windows и сообщения -> Winuser.h -> EnumWindows .
Похожие вопросы