我正在开发一个基本的按键转换器应用程序。转换适用于以下内容:
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 :(得分:2)
因为按键键按包含一个keydown和一个键
答案 1 :(得分:0)
CGEventTapCreate
doc页面的讨论部分说:
如果满足下列条件之一,则事件点击会接收键入和按键事件:
- 当前进程以root用户身份运行。
- 启用辅助设备访问。在OS X v10.4中,您可以使用“系统偏好设置”,“通用访问”面板,“键盘视图”启用此功能。
作为root用户运行肯定对我有用(MacOS Sierra。)我没有尝试过辅助设备方法。
要在XCode中以root身份运行(此时我有8.3.3),选择产品/方案/编辑方案... /运行/信息/调试进程为:root
在CGEventTapCreate
调用中,将kCGEventMaskForAllEvents
参数替换为CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp)
。现在,大多数按键都会调用你的回调,除了修改键:shift,ctrl,cmd,某些功能键。
要获取为修饰键调用的回调,请添加CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(NX_SYSDEFINED)
。出于某种原因,通过此更改,我还可以按下鼠标按钮调用回调。这可能是Logitech鼠标驱动程序如何工作的副作用 - 我没有调查。但是呼叫量远低于以前,并且不包括鼠标移动。