Objective c 在Swift for macOS中,每次最前面的窗口更改时都会获取窗口标题
目标 我想在最前面的活动应用程序的最前面的窗口的Swift、完整窗口标题中打印到控制台,只要标题(当然是活动应用程序)发生更改。 我对Swift/Objective-C都很陌生,所以如果ObjC中也有任何解决方案,我也会非常高兴。(因为有一种叫做AppleScriptObjc的东西,但我就是不明白它是如何工作的) 我到目前为止所做的事情Objective c 在Swift for macOS中,每次最前面的窗口更改时都会获取窗口标题,objective-c,swift,macos,applescript,applescript-objc,Objective C,Swift,Macos,Applescript,Applescript Objc,目标 我想在最前面的活动应用程序的最前面的窗口的Swift、完整窗口标题中打印到控制台,只要标题(当然是活动应用程序)发生更改。 我对Swift/Objective-C都很陌生,所以如果ObjC中也有任何解决方案,我也会非常高兴。(因为有一种叫做AppleScriptObjc的东西,但我就是不明白它是如何工作的) 我到目前为止所做的事情 class activeApp: NSObject { override init() { super.init() NSWorkspa
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]消息跟踪器:加载\u域\u白名单\u搜索树:73:不支持搜索树文件的格式版本号(0)
2017-11-06 15:49:20.113787+0300命令行[82318:6291735]消息跟踪器:返回默认白名单
然后,它仅在每次执行applescript代码时打印此消息(因此每次活动应用程序更改时):
2017-11-06 15:49:20.394204+0300命令行[82318:6291735]应用程序事件:收到的mach msg不是getMemoryReference中预期的复杂类型
如果我用更多的tell和if编写applescript代码,它会打印相同的消息更多次(如3、4等)
尽管这些错误显示在控制台中,但代码工作正常,每次“活动应用程序”更改时都会打印标题和应用程序名称
编辑错误:一位苹果开发人员表示,这些错误是实际的错误,将被删除
问题
注意:我已经在其他类似问题中寻找了几个小时的可能解决方案,但事实并非如此。请不要建议类似标题问题的链接,它们包含关于我的问题的有用信息,但不直接回答这些问题。提前谢谢,编码快乐 这些控制台消息似乎不是
错误
,而是警告
…您是如何解决问题的?我还需要找出运行应用程序的窗口标题。@AndrejFogelton没有在最前端的应用程序每次更改时都收到通知,而是实现了一个计时器,它每秒钟询问一次标题,如果标题发生更改,就采取相应的行动。1秒的CPU时间相当长,所以它解决了我的问题。我使用了“NSWorkspace.shared.frontmostApplication.localizedName”来获取最前端应用程序的窗口标题