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

问题描述 投票:2回答:1

我试图使用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。任何帮助将不胜感激。

swift xcode macos accessibility axuielement
1个回答
0
投票

感谢来自@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。仍然可以使用其他可能更好或不使用辅助功能的方法。

© www.soinside.com 2019 - 2024. All rights reserved.