4

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

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 文档中最好地看出这是我想要的,并且会清除鼠标移动和点击。不幸的是,使用它似乎只是吃掉击键,而不是转换它们。

我究竟做错了什么?

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

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

2 回答 2

2

因为击键按键由 keydown 和 key up 组成

于 2013-02-10T16:44:21.553 回答
1
  1. 文档页面的讨论部分说:CGEventTapCreate

    如果以下条件之一为真,则事件轻击会接收按键向上和按键向下事件:

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

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

  2. 要在 XCode 中以 root 身份运行(我目前有 8.3.3),请选择Product/Scheme/Edit Scheme.../Run/Info/Debug Process As: root

    XCode 的编辑方案对话框

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

    要为修饰键调用回调,请添加CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(NX_SYSDEFINED). 出于某种原因,通过此更改,我还获得了为按下鼠标按钮调用的回调。这可能是罗技鼠标驱动程序工作方式的副作用——我没有调查。但通话量比以前低得多,而且不包括鼠标移动。

    Dave Keck 对这个 CocoaBuilder 线程的响应因为弄清楚了这一点而受到赞誉。

于 2017-06-29T03:46:46.190 回答