2

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

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

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

  • 已回答

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

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

2 回答 2

5

您可以轻松找到应用程序是否处于活动状态isActive。然后随意查看localizedNamebundleIdentifier。我对 Objective-C 不是很流利,但是使用 Macruby 语法,您可以通过以下方式获得它:

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

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

于 2012-06-04T12:11:35.673 回答
2
NSWorkspace *workSpace = [NSWorkspace sharedWorkspace];

NSString *appPathIs = [workSpace fullPathForApplication:appName];

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

NSArray *selectedApps = 
   [NSRunningApplication runningApplicationsWithBundleIdentifier:identifier];
于 2012-06-04T09:29:44.270 回答