首页 > 解决方案 > 核心图形的基本事件处理

问题描述

我正在尝试使用 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");



}

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

附言

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

标签: macoseventscore-graphicscore-foundation

解决方案


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

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


推荐阅读