私はOSX開発にかなり慣れていないので、これは簡単かもしれませんが、グーグルは役に立ちませんでした。
新しいAppleキーボードにあるメディアキー(再生、一時停止など)にアクションをバインドしようとしています。通常のホットキーAPIを使用してこれらのキーにバインドすることはできないようですが、iTunesが明確に管理しているため、バインドできるはずです。これを実現するトリッキーな文書化されていないAPIはありますか?どんな助けでも大歓迎です。
より広範囲なグーグルの後、このhttp://www.rogueamoeba.com/utm/2007/09/29/は問題に対処しているようです。簡単な解決策はありませんが、本物のCocoaアプリを開発しているのであれば、少なくともこれは可能だと思われます。
私の調査によると、オペレーティングシステムは、他のプロセスで使用できるようになる前に、これらの重要なイベントをトラップしています。次のようにCGEventTapを作成しました。
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;
}
コンソールに記録されているのは、ファンクションキー(「fn」キーも押している場合)の通常のログメソッドを取得することですが、メディアキー、明るさ、音量、またはイジェクトキーを押しても、何も表示されません。ログに記録されます。
したがって、このことから、残念ながら、メディアキーイベントをキャプチャする方法はないように見えます。しかし、私は間違っていると証明されたいです。
編集:これを機能させるには、rootとして実行するか、システム環境設定の[ユニバーサルアクセス]ペインで支援デバイスへのアクセスをオンにする必要があることを指摘するのを忘れました。