macos - 核心图形的基本事件处理
问题描述
我正在尝试使用 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 上下文。
解决方案
要回答您的问题:要通过CGEventTap
您的应用程序获取键盘事件,必须信任您的应用程序才能使用辅助功能 API 控制您的计算机。这意味着它必须在系统偏好设置 -> 安全和隐私 -> 可访问性下的应用程序列表中。您可以使用该功能AXProcessIsTrustedWithOptions
请求此权限;您必须经过代码签名,但不是沙盒,并且应该打包为 .app 以便添加到受信任的应用程序列表中。
至于你的第二个问题,如果这是处理游戏事件的好方法……不是真的,不是。使用NSEvent
/ NSApplication
API 获取应用程序的输入。CGEventTap
当您想要获取整个用户会话或另一个应用程序的事件时,这是一个更好的选择,以便在另一个应用程序位于最前面时执行诸如挂钩用户输入以执行自定义操作(因为辅助应用程序通常必须这样做)。特别是通过传递kCGHIDEventTap
您已要求在事件进入窗口服务器时将事件传递给您的应用程序......这很容易导致您的应用程序中的错误能够使会话不可用(例如,通过意外丢弃所有输入到会议)。
推荐阅读
- discord - 我想要一个不和谐的机器人通过他们的 id 向某人发送 dm
- php - PHP:无法添加到空关联数组
- python-3.x - svm sklearn 挂在 OneVsRestClassifier 拟合
- session-variables - 将会话值从一个应用程序传递到下一个应用程序
- java - PrimeFaces 验证器属性方法中的 NPE
- asp.net - .NET 5 以前版本中的 MaintainScrollPosition 替代方案?
- flutter - Flutter中限制Image Widget的大小和纵横比
- python-3.x - 根据另一列中的相同日期时间替换重复行的值,但保持最后一行不变
- openssl - aes多位高清解密openssl
- c++ - 检查函数模板是否可调用