2013-02-08 53 views
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 doc on Event Types得知它是我想要的,并且会清除鼠标移动和点击。不幸的是,使用这个似乎只是吃击键,而不是转换它们。

我在做什么错?

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

CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(NX_SYSDEFINED) 
+0

我一直在寻找到这一点和IM不知道这就是答案与否。我也注意到当你看着你的东西。NX_SYSDEFINED似乎不适用于我 – Fallenreaper 2017-05-13 22:22:34

回答

2

因为按键按键由KeyDown和关键了

+0

因此,KeyDown和KeyUp不是可以独立检测到的两个独立事件吗?在iOS虚拟按钮上,我可以将touchUpInside检测为与touchDown不同的事件。 – DenVog 2013-02-10 22:27:11

+0

取决于你如何处理它 - 向我们展示接收代码 – 2013-02-11 08:05:31

0
  1. CGEventTapCreate文档页面的讨论节说的:

    事件水龙头接收如果满足以下条件之一,则键入和按下事件:

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

    运行在root用户对我确实是制订(MacOS的塞拉利昂。)我没有尝试的辅助设备的方法。

  2. 要为里面的XCode root身份运行(我有8.3.3在这个时候),选择产品/方案/编辑计划... /运行/信息/调试过程作为:根

    XCode's Edit Scheme dialog

  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得知这一点。