为什么不按键事件掩码工作,但掩码全部吗?

时间:2013-02-08 17:55:29

标签: macos cocoa keyboard keyboard-events cgeventtap

我正在开发一个基本的按键转换器应用程序。转换适用于以下内容:

CFRunLoopSourceRef runLoopSource = NULL;
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);

正如您所料,kCGEventMaskForAllEvents不断触发任何鼠标移动或点击键盘以外的其他操作,我怀疑是会占用系统资源。我尝试替换CGEventMaskBit(kCGEventKeyDown),我可以从Quartz Event doc on Event Types告诉我最好的东西,并且会清除鼠标移动和点击。不幸的是,使用它似乎只是吃键击,而不是转换它们。

我做错了什么?

以下是有效的,但我仍然不明白为什么CGEventMaskBit(kCGEventKeyUp)本身并不是正确的实现。

CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED)

2 个答案:

答案 0 :(得分:2)

因为按键键按包含一个keydown和一个键

答案 1 :(得分:0)

  1. CGEventTapCreate doc页面的讨论部分说:

      

    如果满足下列条件之一,则事件点击会接收键入和按键事件:

         
        
    • 当前进程以root用户身份运行。
    •   
    • 启用辅助设备访问。在OS X v10.4中,您可以使用“系统偏好设置”,“通用访问”面板,“键盘视图”启用此功能。
    •   

    作为root用户运行肯定对我有用(MacOS Sierra。)我没有尝试过辅助设备方法。

  2. 要在XCode中以root身份运行(此时我有8.3.3),选择产品/方案/编辑方案... /运行/信息/调试进程为:root

    XCode's Edit Scheme dialog

  3. CGEventTapCreate调用中,将kCGEventMaskForAllEvents参数替换为CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp)。现在,大多数按键都会调用你的回调,除了修改键:shift,ctrl,cmd,某些功能键。

    要获取为修饰键调用的回调,请添加CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(NX_SYSDEFINED)。出于某种原因,通过此更改,我还可以按下鼠标按钮调用回调。这可能是Logitech鼠标驱动程序如何工作的副作用 - 我没有调查。但是呼叫量远低于以前,并且不包括鼠标移动。

    Dave Keck's response to this CocoaBuilder thread因为搞清楚而获得赞誉。