如何检测OSX上正在运行的应用程序

时间:2012-06-04 09:01:48

标签: objective-c xcode macos cocoa background-process

我想将我的应用程序作为菜单栏应用程序,我已经完成了。 而且我还想跟踪正在运行的应用程序。

NSRunningApplication方法返回所有runnng应用程序。 但我想检测现在激活的唯一应用程序。 (用鼠标点击或命令+标签......) 我怎么能找到它?

我在下面制作了代码:

- (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];
}

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

  • 回答

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

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

2 个答案:

答案 0 :(得分:5)

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

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

您可能需要过滤掉自己的应用程序:我没有测试如何处理菜单栏应用程序。

答案 1 :(得分:2)

NSWorkspace *workSpace = [NSWorkspace sharedWorkspace];

NSString *appPathIs = [workSpace fullPathForApplication:appName];

NSString *identifier = 
   [[NSBundle bundleWithPath:appPathIs] bundleIdentifier];

NSArray *selectedApps = 
   [NSRunningApplication runningApplicationsWithBundleIdentifier:identifier];