【问题标题】:Basic event handling with core graphics核心图形的基本事件处理
【发布时间】:2018-12-13 21:06:15
【问题描述】:

我正在尝试在 mac os 上处理具有核心图形和核心基础的事件。

我的代码:

#import <CoreGraphics/CoreGraphics.h>
#import <CoreFoundation/CoreFoundation.h>

static int counter = 0;

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

    printf("event 0x%i\n ", counter++);

    return event;
}


int main(int argc, const char * argv[]) {


    CFRunLoopRef runner = CFRunLoopGetCurrent();





    CFMachPortRef mach = CGEventTapCreate(kCGHIDEventTap,kCGTailAppendEventTap , kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);


    CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mach, 0);

    CFRunLoopAddSource(runner, runLoopSource, kCFRunLoopCommonModes);

    CGEventTapEnable(mach, true);


    CFRunLoopRun();

    printf("end\n");



}

但它只对触摸板事件作出反应。我的程序似乎忽略了键盘事件。我曾尝试更改事件掩码,但我不工作。能给点建议吗?

PS

这是处理事件的好开始吗?我想做全屏OpenGL游戏 核心图形没有像 SFML 或 SDL 这样的库。 我正在使用 CGDisplayCapture 和 CGL 创建 OpeGL 上下文。

【问题讨论】:

    标签: macos events core-graphics core-foundation


    【解决方案1】:

    要回答您的问题:要通过CGEventTap 获取键盘事件,您的应用必须受信任才能使用辅助功能 API 控制您的计算机。这意味着它必须在系统偏好设置 -> 安全和隐私 -> 可访问性下的应用程序列表中。您可以使用函数AXProcessIsTrustedWithOptions 请求此权限;您必须经过代码签名,但不是沙盒,并且应该打包为 .app 才能添加到受信任的应用程序列表中。

    关于你的第二个问题,如果这是处理游戏事件的好方法……不是真的,不是。使用NSEvent/NSApplication API 获取应用程序的输入。当您想要获取整个用户会话或另一个应用程序的事件时,CGEventTap 是一个更好的选择,以便在另一个应用程序位于最前面时执行诸如挂钩用户输入以执行自定义操作(因为辅助应用程序通常必须这样做)。特别是通过传递kCGHIDEventTap,您已经要求在事件进入窗口服务器时将事件传递给您的应用程序......这很容易导致您的应用程序中的错误能够使会话不可用(例如,通过意外丢弃会话的所有输入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多