Чтобы получить список текущих открытых окон в операционной системе 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. Обратите внимание, что вам может понадобиться добавить проверки ошибок для более надежного кода.