NSWorkspace 的“frontmostApplication”在初次使用后不会改变

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

我正在尝试获取当前活动(前台)应用程序的更新。甚至隔着电脑屏幕。我正在使用这段代码来尝试做到这一点:

print(NSWorkspace.sharedWorkspace().frontmostApplication?.localizedName)

此命令每 3 秒在命令行应用程序中循环一次,并打印到控制台。它适用于任何首次启动时打开为活动状态的应用程序。

但是,之后与第一个应用程序相比并没有改变。 1. 为什么要这样做? 2. 使其正常工作的正确代码是什么? 3、有没有一种方法可以在每次最前面的应用程序发生变化时,简单地获取应用程序名称? (最好是 swift 或 obj-c)

swift cocoa xcode6 nsworkspace
2个回答
3
投票

有没有一种方法可以在每次最前面的应用程序发生变化时简单地获取应用程序名称?

使用NSWorkspace通知

NSWorkspaceDidActivateApplicationNotification


0
投票

问题在于您没有在 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()
。 对于第三点,请参阅马特的回答。

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