在OS X中,我如何检测当前活动的应用程序何时更改?

4
尝试编写一个适用于OS X的应用程序,根据当前应用程序触发某种行为。它不需要与其交互,只需要知道何时更改以及更改为何。
有人可以推荐可用于此目的的API吗?我猜想可能是辅助服务中的某些内容,因为大多数类似BetterTouchTool等应用程序需要与当前应用程序进行交互。然而,这些应用程序直接操作这些窗口,而我仅寻找只读访问权限,因此我不确定是否需要。
非常感谢任何指导或参考链接。
(附言:对标签感到抱歉。我尝试过的所有内容都没有“活动应用程序”,“当前应用程序”,“焦点应用程序”等。)
1个回答

8
您可以使用NSWorkspace来获取应用程序变为活动状态(NSWorkspaceDidActivateApplicationNotification)或取消活动状态(NSWorkspaceDidDeactivateApplicationNotification)时得到通知。有关更多信息,请参阅NSWorkspace的文档。
在您的控制器类中,您可以这样做:
- (id)init {
   if ((self = [super init])) {
       [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                             selector:@selector(appDidActivate:)
                            name:NSWorkspaceDidActivateApplicationNotification
                              object:nil];
   }
   return self;
}

- (void)dealloc {
    [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
    [super dealloc];
}

- (void)appDidActivate:(NSNotification *)notification {
   NSDictionary *userInfo = [notification userInfo];
   NSLog(@"userInfo == %@", userInfo);

}

关键点基本上是您需要注册以接收通知,就像在 -init 中所示。 您需要重复该代码,为每个其他要使用的通知名称添加另一个观察者(例如 NSWorkspaceDidDeactivateApplicationNotification)。
另一个重要的事情要记住是在 -dealloc(或其他地方)中将自己作为观察者移除,以便 NSWorkspace 在释放+ dealloc'd(并且不再有效)后不会尝试通知您的控制器对象。
在指定的 -appDidActivate: 方法中,根据需要处理有关所讨论应用程序的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接