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

标签 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]
}

当编译为命令行二进制文件并运行时,在允许程序从系统偏好设置 -> 隐私和安全后,全局事件监控起作用;然后我将它打包成一个 .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/

相关文章:

objective-c - 什么会导致 CGDisplayCreateImageForRect 捕获或忽略光标?

wpf - 处理 WPF 退出事件

使用条件变量的 C++ 监视器类/包装器

Javascript自定义对象需要监听另一个自定义对象事件

language-agnostic - 事物如何在视觉上表现出来?

c++ - 这个极其简单的线程监视器实现有什么不安全的地方?

objective-c - NSTextField 在哪里?

objective-c - 控制 NSMenuItem 插入/填充?

macos - 如何按宽度分割 NSAttributedString?

c# - 每当属性的值发生变化时引发事件?