OSX 10.5 での Apple キーボードのメディア キーへのバインド [終了]
質問
私は OSX 開発にはあまり慣れていないので、これは簡単かもしれませんが、Google は役に立ちませんでした。
新しい Apple キーボードにあるメディア キー (再生、一時停止など) にアクションをバインドしようとしています。通常のホットキー API を使用してこれらのキーにバインドすることはできないようですが、iTunes が明らかに管理しているため、それは可能であるはずです。これを実現する、文書化されていないトリッキーな API はあるのでしょうか?助けていただければ幸いです。
解決
より広範グーグル後、この http://www.rogueamoeba.com/ UTM / 2007/9月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 として実行するか、システム環境設定の「ユニバーサル アクセス」ペインで補助デバイスへのアクセスをオンにする必要があります。