如何使用Swift的AXUIElementCopyAttributeValue?

时间:2014-08-29 19:44:58

标签: objective-c swift

我正在尝试使用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做这件事。

1 个答案:

答案 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,不会转为一个?显然我错过了一些明显的东西......