是否需要用户界面才能在Cocoa中进行全局事件监控?

时间:2014-01-23 08:05:17

标签: cocoa events monitor keyboard-events hotkeys

我有一个简单的代码片段(不是MVC),如下所示

# include <Cocoa/cocoa.h> 

int main(argc, *argv[]) {
    [NSApplication sharedApplication]
    [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask handler:^(NSEvent *evt){ .... }]
    [NSApp run]
}

当编译为命令行二进制并运行时,全局事件监视在允许程序进入系统首选项后工作 - &gt;隐私和安全;然后我将它打包成一个.app,并运行它,即使在允许隐私和应用程序的应用程序之后,全局监视器也停止了工作。安全。

我是Cocoa的新手,为了为打包的应用程序实现一个简单的全局监视器,我还需要做什么?

1 个答案:

答案 0 :(得分:1)

  然后我把它打包成一个.app

您是将CLI程序放在应用程序包中还是重新开始使用新的图形Cocoa应用程序?

我建议您使用Xcode的项目窗口创建一个新的GUI应用程序,然后使用以下代码段作为您的applicationDidFinishLaunching:implementation:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    Boolean isTrusted = AXIsProcessTrustedWithOptions(CFDictionaryCreate(NULL, (const void*[]){ kAXTrustedCheckOptionPrompt }, (const void*[]){ kCFBooleanTrue }, 1, NULL, NULL));
    if(isTrusted)
    {
        [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask handler:^(NSEvent *evt){ NSLog(@"Received NSKeyUp event."); }];
    }
}

这将自动打开“系统首选项”窗格,允许用户选择应该信任您的应用程序。 AXIsProcessTrustedWithOptions需要OS X 10.9(Mavericks)。

<强>更新
调试全局事件监视器时,“支持辅助设备”存在一些缺陷:

  • 当使用附加的调试器通过Xcode“Build&amp; Run”启动应用程序包时,Xcode也需要在Privacy pref窗格中被授予可访问性权限
  • 当安装了监视器的Cocoa应用程序中的窗口位于前台时,全局事件监视器不会收到事件。