我正在尝试获取当前活动(前台)应用程序的更新。甚至隔着电脑屏幕。我正在使用这段代码来尝试做到这一点:
print(NSWorkspace.sharedWorkspace().frontmostApplication?.localizedName)
此命令每 3 秒在命令行应用程序中循环一次,并打印到控制台。它适用于任何首次启动时打开为活动状态的应用程序。
但是,之后与第一个应用程序相比并没有改变。 1. 为什么要这样做? 2. 使其正常工作的正确代码是什么? 3、有没有一种方法可以在每次最前面的应用程序发生变化时,简单地获取应用程序名称? (最好是 swift 或 obj-c)
问题在于您没有在 RunLoop 中运行代码。 例如
import AppKit
while true {
print("app: " + (NSWorkspace.shared.frontmostApplication?.executableURL?.lastPathComponent ?? ""))
sleep(1)
}
此代码不会更新最前面的应用程序,因为
NSWorkspace
不会在后台处理事件。
但是如果你使用像这样的 RunLoop
func printApp() {
print("app: " + (NSWorkspace.shared.frontmostApplication?.executableURL?.lastPathComponent ?? ""))
}
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
printApp()
}
RunLoop.current.run()
它按预期工作。 在 C/C++ 中,您可以使用
CFRunLoopRun()
。
对于第三点,请参阅马特的回答。