我有一个简单的代码片段(不是 MVC),如下所示
# include <Cocoa/cocoa.h>
int main(argc, *argv[]) {
[NSApplication sharedApplication]
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask handler:^(NSEvent *evt){ .... }]
[NSApp run]
}
当编译为命令行二进制文件并运行时,在允许程序从系统偏好设置 -> 隐私和安全后,全局事件监控起作用;然后我将它打包成一个 .app 并运行它,即使在允许应用程序隐私和安全之后,全局监视器也停止工作。
我是 Cocoa 的新手,为了为打包的应用程序实现一个简单的全局监视器,我还需要做什么?
最佳答案
then I packed it int an .app
您是否将 CLI 程序放入应用程序包中,或者是否从新的图形 Cocoa 应用程序开始?
我建议您使用 Xcode 的项目窗口创建一个新的 GUI 应用程序,然后使用以下代码片段作为您的 applicationDidFinishLaunching: 实现:
- (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."); }];
}
}
这将自动打开“系统首选项” Pane ,允许用户选择是否应信任您的应用程序。 AXIsProcessTrustedWithOptions需要 OS X 10.9 (Mavericks)。
更新
调试全局事件监视器时,存在一些关于“辅助设备支持”的陷阱:
- 通过带有附加调试器的 Xcode“构建和运行”启动应用程序包时,还需要在“隐私”偏好设置 Pane 中为 Xcode 授予可访问权限
- 当安装监视器的 Cocoa 应用程序的窗口位于前台时,全局事件监视器不会接收事件。
关于cocoa - 在 Cocoa 中进行全局事件监控是否需要用户界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302593/