当Cocoa中的当前应用程序发生更改时如何获得通知

13

我希望在当前应用程序更改时收到通知。我查看了NSWorkspace,但它只会在自己的应用程序变为活动状态或失去活动状态时发送通知。 我想要关于每个应用程序的信息。在Cocoa中我该如何做到这一点?


2
无法从Cocoa中获取此信息。您必须使用Carbon事件管理器来获取有关进程何时变为活动状态的通知。 - Jason Coco
2个回答

26

已确认在2014年的OS X 10.9上可以运行(除了我必须删除@selector方法中的冒号)。谢谢! - Jimmie Tyrrell
1
冒号在这里是因为我期望你的选择器看起来像这样: - (void)foremostAppActivated:(NSNotification *)notification - mrwalker

13

谢谢Jason。Carbon事件管理器中的kEventAppFrontSwitched是解决问题的关键。

- (void) setupAppFrontSwitchedHandler
{
    EventTypeSpec spec = { kEventClassApplication,  kEventAppFrontSwitched };
    OSStatus err = InstallApplicationEventHandler(NewEventHandlerUPP(AppFrontSwitchedHandler), 1, &spec, (void*)self, NULL);

    if (err)
        NSLog(@"Could not install event handler");
}

- (void) appFrontSwitched {
    NSLog(@"%@", [[NSWorkspace sharedWorkspace] activeApplication]);
}

处理程序

static OSStatus AppFrontSwitchedHandler(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData)
{
    [(id)inUserData appFrontSwitched];
    return 0;
}

是的,我为某个之前发布通知的人制作了一个小例子,但我找不到它了。你提供了一个很好的总结,你应该接受这个答案 :) - Jason Coco
备注:要成功构建使用此内容的应用程序,您必须将Carbon和Core Services框架添加到您的构建中,并在包含处理程序的实现文件中包括<Carbon/Carbon.h>和<CoreServices/CoreServices.h>。请参见https://dev59.com/FnRA5IYBdhLWcg3w2x0I,了解如何将C与Objective-C混合使用。 - Christoph

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