这里是设置事件监听器的方法。
CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit(kCGEventKeyDown),
&KeyDownCallback,
NULL);
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(NULL, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CFRelease(runLoopSource);
CGEventTapEnable(eventTap, true);
接下来是“回调函数”:
static CGEventRef KeyDownCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
NSEvent *e = [NSEvent eventWithCGEvent:event];
return event;
}
在已解析的NSEvent上,有modifierFlags和keyCode属性。keyCode是按下的键的代码,而modifierFlags则是不同的修饰符(Shift、Alt/Option、Command等)。
在KeyDownCallback方法中,简单地返回NULL即可停止事件传播。
注意:事件挂钩超时似乎存在问题,为解决此问题,您可以“重置”事件挂钩。
在KeyDownCallback方法中,检查CGEventType类型是否为kCGEventTapDisabledByTimeout,代码如下:
if (type == kCGEventTapDisabledByTimeout)
{
return NULL;
}
当出现Reset eventTap
时,重新执行上面的事件监听器设置。