私の調査から、オペレーティングシステムは、他のプロセスが利用できるようになる前に、それらの重要なイベントをトラップしています。
int main(int argc, char *argv[]) {
CFMachPortRef eventTap;
CFRunLoopSourceRef runLoopSource;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
if (!eventTap) {
NSLog(@"Couldn't create event tap!");
exit(1);
}
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CFRunLoopRun();
CFRelease(eventTap);
CFRelease(runLoopSource);
exit(0);
}
そして、実際のイベントのコールバックはこれです:あなたがコンソールにログインしてご覧ください何
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (type == kCGEventKeyUp) {
CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
NSLog(@"%d", keycode);
}
return event;
}
あなたは、通常のログ方法を得ることであるので、は次のように私は、CGEventTapを作成しましたファンクションキーの場合(「fn」キーを押したままにしている場合)、メディアキー、輝度、音量、またはイジェクトキーを押すとは表示されません。が記録されます。
このように、残念ながら、メディアキーイベントをキャプチャする方法はないようです。しかし、私は間違っていることが証明されたい。
編集:これが機能するには、rootとして実行する必要があるか、システム環境設定の「ユニバーサルアクセス」パネルで補助デバイスのアクセスをオンにする必要があることを忘れてしまいました。
問題は、iTunesがこれらの鍵から反応するのを防ぐ方法がないことです。アプリケーションを制御するためにこれらの鍵を使用するのが賢明ではありません。 – adib