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.
This commit is contained in:
chenmingxuan committed 2026-10-27 01:13:43 +08:00
1 parent dccddaa7e8
commit b780a60e8d
20 files changed
+759 -149

No files matched your search

+105
View File
@@ -0,0 +1,105 @@
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
}