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

时间:2017-11-06 13:38:04

标签: objective-c swift macos applescript applescript-objc

目标

每当标题(或当前的活动应用程序)发生变化时,我想打印到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()}

我知道这个代码只会在活动应用程序更改时打印窗口标题和活动应用程序,而不是在停留在同一个应用程序时标题更改时。但是,我想在处理控制台上显示的错误后处理它。

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

  

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 msg,它不是getMemoryReference中预期的复杂类型。

如果我用更多的说明书编写带有更多说明的AppleScript代码,那么它会打印相同的消息(如3,4等)

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

编辑错误: 苹果开发人员表示这些错误是实际错误,并且会solved

问题

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

  2. 你认为没有其他任何方式没有苹果吗?我没有找到任何其他方法来获取没有Applecript的窗口标题。

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

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

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

0 个答案:

没有答案