objective-c - 如何检测 OSX 上正在运行什么应用程序

标签 objective-c xcode macos cocoa background-process

我想将我的应用程序制作为菜单栏应用程序,并且我已经做到了。 我还想跟踪正在运行的应用程序。

NSRunningApplication 方法返回所有正在运行的应用程序。 但我想检测现在唯一激活的应用程序。 (用鼠标单击或命令+选项卡...) 我怎样才能找到它?

我编写了以下代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(performTimerBasedUpdate) userInfo:nil repeats:YES];
}

- (void)performTimerBasedUpdate {
     nowRunning = [NSRunningApplication currentApplication];
     nowRunningName = [nowRunning localizedName];
}

但是,它返回我(自己)创建的应用程序名称。

  • 已回答

我终于找到答案了:谢谢 i-blis。 我可以通过过滤器获取激活的应用程序。 我不知道 isActive 属性!

runningApplications_ = [[NSWorkspace sharedWorkspace] runningApplications];
nowRunning = [[runningApplications_ filteredArrayUsingPredicate:isActive] objectAtIndex:0];
bundleIdentifier_ = [nowRunning bundleIdentifier];
localizedName = [nowRunning localizedName];

最佳答案

您可以使用 isActive 轻松查找应用程序是否处于事件状态。然后根据您的意愿查看 localizedNamebundleIdentifier。我不太精通 Objective-C,但使用 Macruby 语法,您可以通过以下方式获得它:

NSWorkspace.sharedWorkspace.runningApplications
    .select { |e| e.isActive == true }
    .map { |e| e.localizedName }

您可能需要过滤掉自己的应用程序:我没有测试菜单栏应用程序在这方面的处理方式。

关于objective-c - 如何检测 OSX 上正在运行什么应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878746/

相关文章:

c++ - 如何使用 libcurl 保存图像

ios - 使用 xcodebuild 使用 macOS header

objective-c - 打印ivar值的通用Objective-C描述方法

ios - UINavCtrlr 推送动画将内容部分移开然后消失

ios - 为什么我在 Xcode 7.3 中找不到 iPhone SE 模拟器?

objective-c - 有符号的 Char 到 Int

objective-c - 如果不进行检查,那么制定协议(protocol)还有什么意义呢?

macos - OSX 的 Mach-O 二进制编辑器?

objective-c - Mac OS X 10.8 : Replacement for Lock/UnlockPixels() for the cocoa applications

ios - 如何添加 didSet 以查看 UIViewController 的属性?