zhuyuan-ice-gl-zy001/.tmp_axprobe/probe.swift
2026-08-20 00:01:53 +08:00

48 lines
1.9 KiB
Swift
Executable file

import Cocoa
let app = AXUIElementCreateApplication(1668)
func attr(_ e: AXUIElement, _ name: String) -> CFTypeRef? {
var v: CFTypeRef?
return AXUIElementCopyAttributeValue(e, name as CFString, &v) == .success ? v : nil
}
func frame(_ e: AXUIElement) -> String {
var p = CGPoint.zero, s = CGSize.zero
if let pv = attr(e, kAXPositionAttribute), let sv = attr(e, kAXSizeAttribute) {
AXValueGetValue(pv as! AXValue, .cgPoint, &p)
AXValueGetValue(sv as! AXValue, .cgSize, &s)
return String(format: "(%.0f,%.0f %.0fx%.0f)", p.x, p.y, s.width, s.height)
}
return "?"
}
func str(_ e: AXUIElement, _ a: String) -> String {
if let v = attr(e, a) as? String { return v.replacingOccurrences(of: "\n", with: " ") }
return ""
}
var found = 0
func walk(_ e: AXUIElement, _ depth: Int) {
if found > 40 { return }
let t = str(e, kAXTitleAttribute), v = str(e, kAXValueAttribute), d = str(e, kAXDescriptionAttribute)
let all = t + v + d
if all.contains("批准") || all.contains("拒绝") || all.contains("待审批") || all.contains("画中画") || all.contains("HoloLake") {
print("[HIT d\(depth)] role=\(str(e,kAXRoleAttribute)) title='\(String(t.prefix(60)))' val='\(String(v.prefix(60)))' desc='\(String(d.prefix(60)))' frame=\(frame(e))")
found += 1
}
if let kidsAny = attr(e, kAXChildrenAttribute) as? [AnyObject] {
let kids = kidsAny.map { $0 as! AXUIElement }
for k in kids { walk(k, depth+1) }
}
}
if let wins = attr(app, kAXWindowsAttribute) as? [AXUIElement] {
print("windowCount=\(wins.count)")
for (i,w) in wins.enumerated() {
print("win[\(i)] title='\(str(w,kAXTitleAttribute))' frame=\(frame(w))")
walk(w, 0)
}
}
if let f0 = attr(app, kAXFocusedUIElementAttribute) {
let f = f0 as! AXUIElement
print("FOCUSED role=\(str(f,kAXRoleAttribute)) frame=\(frame(f)) desc='\(String(str(f,kAXDescriptionAttribute).prefix(40)))'")
}