CGEventTapCreate()调用问题

时间:2010-06-01 04:51:46

标签: objective-c cocoa

我正在尝试使用此代码注册全局关键事件:

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。

2 个答案:

答案 0 :(得分:5)

我认为您需要特殊权限才能注册键盘事件。我忘记了那是什么,但为了测试它以root身份运行程序,看它是否仍然崩溃。

编辑:

根据this article,您必须以root身份运行程序或启用辅助设备。

崩溃可能只是因为CGEventTapCreate返回NULL。

答案 1 :(得分:1)

我在此链接上找到了此问题的修复程序:

http://www.cocoabuilder.com/archive/cocoa/242438-trouble-with-event-taps.html