在 macOS 的 Swift 中,每次更改时获取最前面窗口的窗口标题

m41*_*exe 5 macos applescript objective-c applescript-objc swift

目标

每当标题(或当然是活动应用程序)发生变化时,我想在 Swift 中打印到控制台,最前面的活动应用程序的最前面窗口的完整窗口标题。我对 Swift/Objective-C 都很陌生,所以如果也建议 ObjC 中的任何解决方案,我也会非常高兴。(因为有一个叫做AppleScriptObjc的东西,但我只是不明白它是如何工作的)

到目前为止我做了什么

class activeApp: NSObject {
    override init() {
    super.init()
    NSWorkspace.shared.notificationCenter.addObserver(self,
        selector: #selector(printMe(notification:)),
        name: NSWorkspace.didActivateApplicationNotification,
        object:nil)
    }
    @objc func printMe(notification: NSNotification) {
        let app = notification.userInfo!["NSWorkspaceApplicationKey"] as! NSRunningApplication
        let myAppleScript = """
            tell application "System Events"
            return name of first window of (first application process whose frontmost is true)
            end tell
            """
        let script = NSAppleScript(source: myAppleScript)!;
        var errorDict : NSDictionary?
        print(script.executeAndReturnError(&errorDict).stringValue as Any)
        print(app.localizedName!)
    }
}
let runme = activeApp()
RunLoop.main.run()}
Run Code Online (Sandbox Code Playgroud)

我知道此代码仅在活动应用程序更改时打印窗口标题和活动应用程序,而不是在同一应用程序中标题更改时打印。但是,我想在处理控制台上显示的错误后处理该问题。

因此,每次我构建此代码时,它都会在第一次活动应用程序更改时首先在控制台上打印这两条消息:

2017-11-06 15:49:20.113732 + 0300命令行[82318:6291735] MessageTracer:load_domain_whitelist_search_tree:73:不支持搜索树文件的格式版本号(0)

2017-11-06 15:49:20.113787+0300 命令行[82318:6291735] MessageTracer:回退到默认白名单

然后它只在每次执行 applescript 代码时打印此消息(因此每次活动应用程序更改时):

2017-11-06 15:49:20.394204+0300 命令行[82318:6291735] AppleEvents:收到的 mach 消息不是 getMemoryReference 中预期的复杂类型。

如果我用更多的告诉和 if 编写 applescript 代码,它会多次打印相同的消息(例如 3、4 等)

尽管这些错误显示在控制台中,但代码可以正常工作,并在每次“活动应用程序”更改时打印标题和应用程序名称。

编辑错误:苹果开发人员表示这些错误是实际的错误,将得到解决

问题

  1. 关于错误(警告)的任何有用信息都会很棒,因为在谷歌搜索完所有错误后我不知道?编辑:可能是 macOS 10.13 的一个错误,将得到解决

  2. 除了不使用 applescript 之外,您还有其他方法吗?我找不到任何其他方法来获取没有 applescript 的窗口标题。

  3. 如果 Applescript 是做到这一点的方法,这是最好的方法还是任何其他方法会更有效?比如使用 ApplescriptObjc 等。

  4. 无论如何,当标题更改时执行 applescript 代码,而不是简单地将其放入循环中并每隔 X 秒获取信息(就像使用应用程序更改通知一样,可能采用类似的方法?)

注意:我已经在其他提出的类似问题中寻找可能的解决方案了几个小时,但实际上并不存在。请不要建议类似标题问题的链接,它们包含有关我的问题的有用信息,但不直接回答这些问题。预先感谢,祝您编码愉快!