为什么不按下事件遮罩工作,但遮罩都行?
我在开发中有一个基本的按键转换器应用程序。转换适用于以下:为什么不按下事件遮罩工作,但遮罩都行?
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)
因为按键按键由KeyDown和关键了
因此,KeyDown和KeyUp不是可以独立检测到的两个独立事件吗?在iOS虚拟按钮上,我可以将touchUpInside检测为与touchDown不同的事件。 – DenVog 2013-02-10 22:27:11
取决于你如何处理它 - 向我们展示接收代码 – 2013-02-11 08:05:31
-
的
CGEventTapCreate
文档页面的讨论节说的:事件水龙头接收如果满足以下条件之一,则键入和按下事件:
- 当前进程以root用户身份运行。
- 辅助设备访问已启用。在OS X v10.4中,您可以使用系统偏好设置,通用访问面板,键盘视图来启用此功能。
运行在root用户对我确实是制订(MacOS的塞拉利昂。)我没有尝试的辅助设备的方法。
-
要为里面的XCode root身份运行(我有8.3.3在这个时候),选择产品/方案/编辑计划... /运行/信息/调试过程作为:根
-
在
CGEventTapCreate
调用中,将kCGEventMaskForAllEvents
参数替换为CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp)
。除了修饰键:shift,ctrl,cmd,某些功能键之外,现在您的回调会被大多数按键调用。要获取修改键调用的回调,请添加
CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(NX_SYSDEFINED)
。出于某种原因,通过这种改变,我也得到了为鼠标按下按钮而调用的回调。这可能是罗技鼠标驱动程序的一个副作用 - 我没有调查。但通话量比以前低很多,不包括鼠标移动。
我一直在寻找到这一点和IM不知道这就是答案与否。我也注意到当你看着你的东西。NX_SYSDEFINED似乎不适用于我 – Fallenreaper 2017-05-13 22:22:34