是否有可能在Mac上使用Cocoa监控其他应用程序?

时间:2011-12-06 03:24:02

标签: objective-c macos cocoa

例如,获取另一个应用程序在屏幕上变为活动状态或重新启动活动状态的通知。

2 个答案:

答案 0 :(得分:7)

不确定。在您的应用委托类中,您可以使用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:方法中,根据相关应用的相关信息,执行您需要的任何操作。

答案 1 :(得分:0)

如果您想要比distributed objects更简单的内容,则可以使用分布式通知中心发布的分布式通知。但是,除非您构建应用程序,否则不会发布这些内容。要监视应用程序何时启动或退出,您可以使用NSWorkspace及其通知中心(由NSGod建议)