Files
chenmingxuan b780a60e8d feat(cua): release 0.38.0+artemis.1 with verified shell observation
Upgrade the pinned driver, validate menu and taskbar focus ownership, patch untitled Shell resolution, and remove duplicate scroll scaling. Publish package provenance, verification boundaries and matching marketplace checksum. Go tests, vet, build and byte-level package verification passed.
2026-10-27 01:13:43 +08:00

106 lines
3.7 KiB
Go

package main
import (
"path/filepath"
"runtime"
"sync"
"syscall"
"unsafe"
)
type windowRect struct{ left, top, right, bottom int32 }
func windowClass(hwnd int64) string {
var value [256]uint16
user32.NewProc("GetClassNameW").Call(uintptr(hwnd), uintptr(unsafe.Pointer(&value[0])), uintptr(len(value)))
return syscall.UTF16ToString(value[:])
}
func nativeWindowInfo(hwnd int64) obj {
if hwnd == 0 {
return obj{}
}
var pid uint32
thread, _, _ := user32.NewProc("GetWindowThreadProcessId").Call(uintptr(hwnd), uintptr(unsafe.Pointer(&pid)))
if pid == 0 {
return obj{}
}
visible, _, _ := user32.NewProc("IsWindowVisible").Call(uintptr(hwnd))
owner, _, _ := user32.NewProc("GetWindow").Call(uintptr(hwnd), 4)
root, _, _ := user32.NewProc("GetAncestor").Call(uintptr(hwnd), 2)
var title [1024]uint16
user32.NewProc("GetWindowTextW").Call(uintptr(hwnd), uintptr(unsafe.Pointer(&title[0])), uintptr(len(title)))
app := ""
process, _, _ := kernel32.NewProc("OpenProcess").Call(0x1000, 0, uintptr(pid))
if process != 0 {
var path [32768]uint16
size := uint32(len(path))
ok, _, _ := kernel32.NewProc("QueryFullProcessImageNameW").Call(process, 0, uintptr(unsafe.Pointer(&path[0])), uintptr(unsafe.Pointer(&size)))
if ok != 0 {
app = filepath.Base(syscall.UTF16ToString(path[:]))
}
kernel32.NewProc("CloseHandle").Call(process)
}
info := obj{"pid": int64(pid), "window_id": hwnd, "thread_id": int64(thread),
"root_window_id": int64(root), "owner_id": int64(owner), "class_name": windowClass(hwnd),
"title": syscall.UTF16ToString(title[:]), "app_name": app, "is_on_screen": visible != 0,
"z_index": nil, "minimized": false}
runtime.LockOSThread()
defer runtime.UnlockOSThread()
previous, _, _ := user32.NewProc("SetThreadDpiAwarenessContext").Call(^uintptr(3))
if previous != 0 {
defer user32.NewProc("SetThreadDpiAwarenessContext").Call(previous)
var rect windowRect
ok, _, _ := user32.NewProc("GetWindowRect").Call(uintptr(hwnd), uintptr(unsafe.Pointer(&rect)))
if ok != 0 {
info["bounds"] = obj{"x": rect.left, "y": rect.top, "width": rect.right - rect.left, "height": rect.bottom - rect.top}
info["is_on_screen"] = visible != 0 && rect.right > rect.left && rect.bottom > rect.top
}
}
return info
}
// A single static callback avoids NewCallback's non-reclaimable slot leak.
var shellEnumerationLock sync.Mutex
var shellEnumeration *[]obj
var shellEnumerator = syscall.NewCallback(func(hwnd, _ uintptr) uintptr {
if shellKind(windowClass(int64(hwnd))) != "" {
info := nativeWindowInfo(int64(hwnd))
if info["is_on_screen"] == true {
*shellEnumeration = append(*shellEnumeration, info)
}
}
return 1
})
func nativeShellWindows() []obj {
shellEnumerationLock.Lock()
defer shellEnumerationLock.Unlock()
var windows []obj
shellEnumeration = &windows
user32.NewProc("EnumWindows").Call(shellEnumerator, 0)
shellEnumeration = nil
return windows
}
func keyboardFocus() obj {
foreground := nativeWindowInfo(foregroundWindow())
var gui struct {
size, flags uint32
active, focus, capture, menuOwner, moveSize, caret uintptr
rect windowRect
}
gui.size = uint32(unsafe.Sizeof(gui))
ok, _, _ := user32.NewProc("GetGUIThreadInfo").Call(0, uintptr(unsafe.Pointer(&gui)))
result := obj{"probe_ok": ok != 0, "foreground_window": foreground}
if ok != 0 {
focused := nativeWindowInfo(int64(gui.focus))
result["focus_window"] = focused
result["focus_root"] = nativeWindowInfo(num(focused["root_window_id"]))
result["active_window"] = nativeWindowInfo(int64(gui.active))
result["menu_owner"] = nativeWindowInfo(int64(gui.menuOwner))
result["menu_active"] = gui.flags&0x1c != 0
}
return result
}