我正在尝试使用此代码注册全局关键事件:
void function()
{
CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL);
CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0);
CFRelease(keyUpEventTap);
CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode);
CFRelease(keyUpRunLoopSourceRef);
}
执行CFMachPortCreateRunLoopSource()调用时应用程序崩溃。我认为崩溃是因为我创建一个事件点击时CGEventMaskBit( kCGEventKeyUp )。
但是如果我使用CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&keyUpCallback,NULL)
创建事件点击,则应用程序可以正常工作。它没有崩溃。当按下任何修改键时,我会收到回调。但是我需要按下删除键的回调。
有什么想法吗?
谢谢,
Dheeraj。
答案 0 :(得分:5)
我认为您需要特殊权限才能注册键盘事件。我忘记了那是什么,但为了测试它以root身份运行程序,看它是否仍然崩溃。
编辑:
根据this article,您必须以root身份运行程序或启用辅助设备。
崩溃可能只是因为CGEventTapCreate返回NULL。
答案 1 :(得分:1)