【问题标题】:Getting notified when the current application changes in Cocoa在 Cocoa 中当前应用程序更改时收到通知
【发布时间】:2010-10-20 06:21:58
【问题描述】:

我希望在当前应用程序发生更改时收到通知。我看了看 NSWorkspace。只有当您自己的应用程序激活或失去活动时,它才会发送通知。 我想了解每个应用程序。如何在 Cocoa 中做到这一点?

【问题讨论】:

  • 不可能从 Cocoa 获得这些信息。您必须使用 Carbon 事件管理器来获取有关您自己以外的进程何时激活的通知。

标签: cocoa


【解决方案1】:

如果您的目标是 10.6 或更高版本,则会收到通知:

// NSWorkspaceDidActivateApplicationNotification
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(foremostAppActivated:) name:NSWorkspaceDidActivateApplicationNotification object:nil];

Apple 文档:http://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSWorkspace_Class/Reference/Reference.html#//apple_ref/doc/uid/20000391-SW97

【讨论】:

  • 确认在 2014 年在 OS X 10.9 上工作(除了我必须删除 @selector 方法中的冒号)。谢谢!
  • 冒号是因为我希望您的选择器看起来像这样:- (void)foremostAppActivated:(NSNotification *)notification
【解决方案2】:

谢谢杰森。 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;
}

【讨论】:

  • 是的,我为不久前实际发布通知的人做了一个小例子,但我找不到它。你给出了一个很好的总结,你应该接受这个答案:)
  • 备注:要使用它成功构建应用程序,您必须将 Carbon 和 Core Services Frameworks 添加到您的构建中,并将 包含在包含处理程序的实现文件。请参阅stackoverflow.com/questions/801976/… 了解如何将 C 与 Objective-C 混合使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
相关资源
最近更新 更多