我正在尝试使用Swift的AXUIElementCopyAttributeValue。我最好的刺是这样的:
private func mainWindow() -> Optional<AXUIElementRef> {
let appRef = AXUIElementCreateApplication(self.pid())
var ptr: Unmanaged<AXUIElementRef>? = nil
var frontWindow: AXUIElementRef? = nil
let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindowAttribute, &ptr)
if err == AXError(kAXErrorSuccess) {
frontWindow = ptr!.takeRetainedValue()
}
return frontWindow
}
不幸的是,kAXMainWindowAttribute不在范围内。这当然适用于ObjC,但我无法弄清楚从Swift访问时隐藏值的位置。这不是我第一次遇到这个问题,虽然之前我已经能够偶然发现并找到它。
另外,我很高兴在这里收到任何风格建议。我不相信我会以最自然的方式为Swift做这件事。
答案 0 :(得分:0)
这还不是答案,但也许可以帮助别人给我答案......我将代码更改为此,以便取得进展:
func mainWindow() -> WBWindow? {
var result: WBWindow? = nil
var ptr: Unmanaged<AnyObject>?
let kAXMainWindow: CFString! = "AXMainWindow" as NSString
let appRef: AXUIElement! = AXUIElementCreateApplication(self.pid()).takeRetainedValue()
let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindow, &ptr)
if err == AXError(kAXErrorSuccess) {
let val: AnyObject? = ptr?.takeRetainedValue()
if val != nil {
let value: AnyObject = val!
let description = CFCopyTypeIDDescription(CFGetTypeID(value))
println("type = \(description)")
}
else {
NSLog("got nil result")
}
// result = WBWindow(element: ptr?.takeRetainedValue() as? AXUIElement)
}
return result
}
现在建立 - 耶!但是,在运行时,注释掉的行将我放入堆栈中:
0x1001b57ea: leaq 0x3f1a1(%rip), %rax ; "Swift dynamic cast failed"
我添加了上面的调试代码并生成:
type = AXUIElement
SOOOOO。这是一个AXUIElement,不会转为一个?显然我错过了一些明显的东西......