イベントリスナーの設定方法は次のとおりです
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)
{
/* Do something with the event */
NSEvent *e = [NSEvent eventWithCGEvent:event];
return event;
}
解析された NSEvent には、プロパティmodifierFlagsとkeyCodeプロパティがあります。keyCodeは押されたキーのコードであり、押されmodifierFlagsたさまざまな修飾子 (Shift、Alt/Option、Command など) です。
単にイベントの伝播を停止する方法でreturn NULL;。KeyDownCallback
注: イベント タップのタイムアウトに問題があるようです。この問題を解決するには、イベント タップを「リセット」します。
KeyDownCallbackメソッドで、が次のようになってCGEventType typeいるかどうかを確認します。kCGEventTapDisabledByTimeout
if (type == kCGEventTapDisabledByTimeout)
{
/* Reset eventTap */
return NULL;
}
ここReset eventTapで、上記のイベントリスナーのセットアップを再度実行します。