イベントリスナーの設定方法は次のとおりです
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
で、上記のイベントリスナーのセットアップを再度実行します。