【问题标题】:Why Doesn't Key Down Event Mask Work, but Mask All Does?为什么 Key Down 事件掩码不起作用,但全部掩码起作用?
【发布时间】:2013-02-08 17:55:29
【问题描述】:

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

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)

【问题讨论】:

  • 我已经对此进行了一些研究,但我不确定这是否是答案。我在看你的东西时也注意到了。 NX_SYSDEFINED 似乎对我不起作用

标签: macos cocoa keyboard keyboard-events cgeventtap


【解决方案1】:

因为击键按键由按下键和按下键组成

【讨论】:

  • 那么 KeyDown 和 KeyUp 不是两个可以独立检测的独立事件吗?在 iOS 虚拟按钮上,我可以将 touchUpInside 检测为与 touchDown 不同的事件。
【解决方案2】:
  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

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

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

    Dave Keck's response to this CocoaBuilder thread 因发现这一点而受到赞誉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多