Swift - 在另一个应用程序中获取当前打开文档的文件路径

时间:2018-03-02 19:30:54

标签: swift xcode macos accessibility axuielement

我试图使用swift代码从另一个应用程序获取打开文档的文件路径。我知道如何在AppleScript中执行此操作,如下所示:

tell application "System Events"

if exists (process "Pro Tools") then

    tell process "Pro Tools"

        set thefile to value of attribute "AXDocument" of window 1

    end tell

end if

end tell

这个AppleScript做了我想要的,但我希望能在Swift中做到这一点。我知道一个选项是从我的程序运行这个脚本,但我希望找到另一种方法,可能不使用Accessibility。

在我的应用程序中,我可以通过执行以下操作将应用程序作为AXUIElement:

let proToolsBundleIdentifier = "com.avid.ProTools"
let proToolsApp : NSRunningApplication? = NSRunningApplication
        .runningApplications(withBundleIdentifier: proToolsBundleIdentifier).last as NSRunningApplication?


if let app = proToolsApp {
    app.activate(options: .activateAllWindows)
}


if let pid = proToolsApp?.processIdentifier {   
    let app = AXUIElementCreateApplication(pid)
}

我只是不确定一旦我做了AXUIElement怎么办。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

感谢来自@JamesWaldrop的another post的帮助,我能够自己回答这个问题,并希望在这里发布任何寻找类似内容的人:

let proToolsBundleIdentifier = "com.avid.ProTools"
let proToolsApp : NSRunningApplication? = NSRunningApplication
        .runningApplications(withBundleIdentifier: proToolsBundleIdentifier).last as NSRunningApplication?


if let pid = proToolsApp?.processIdentifier {

    var result = [AXUIElement]()
    var windowList: AnyObject? = nil // [AXUIElement]

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

    var docRef: AnyObject? = nil
    if AXUIElementCopyAttributeValue(result.first!, "AXDocument" as CFString, &docRef) == .success {
        let result = docRef as! AXUIElement
        print("Found Document: \(result)")
        let filePath = result as! String
        print(filePath)
    }
}

这就像AppleScript那样获取AXDocument。仍然可以使用其他可能更好或不使用辅助功能的方法。