我正在尝试使用 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 做这件事。
最佳答案
这还不是答案,但也许可以帮助别人给我答案......我将代码更改为这样,以便取得进展:
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"
我在上面添加了调试代码并产生了:
类型 = AXUIElement
太棒了。这是一个不会转换为一个的 AXUIElement 吗?显然我遗漏了一些明显的东西......
关于objective-c - 如何使用 Swift 中的 AXUIElementCopyAttributeValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575195/