微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Swift中从CFTypeRef转换为AXUIElement

代码生成预期的调试输出类型= AXUIElement,但转储堆栈并表示动态转换在转换的实际点失败:

func mainWindow() {
    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)")
            let element = value as AXUIElement
        }
        else {
            println("got nil result")
        }
    }
}

完成这项工作的正确方法是什么?

解决方法

代码适用于XCode 6.1和Swift 1.1.

然而,现在是3年后,Swift已经变得更好了.当您搜索如何使用Swift的Accessibility API时,这仍然是最佳结果.所以我回来用我目前最简单的方式更新:

func AXUIWindowArray(processIdentifier pid:pid_t) -> [AXUIElement] {
    var result = [AXUIElement]()
    var windowList: AnyObject? = nil // [AXUIElement]

    let appRef = AXUIElementCreateApplication(pid)
    if AXUIElementcopyAttributeValue(appRef,"AXWindows" as CFString,&windowList) == .success {
        result = windowList as! [AXUIElement]
    }
    return result
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐