2009-06-27 2 views
6

私はOSXの開発にはかなり新しいですので、これは簡単かもしれませんが、Googleは役に立ちませんでした。OSX 10.5の下でアップルキーボードのメディアキーにバインドする

新しいAppleキーボード(再生、一時停止など)で見つかったメディアキーにアクションをバインドしようとしています。通常のホットキーAPIを使用してこれらのキーにバインドすることはできないようですが、iTunesが明確に管理しているので可能でなければなりません。これを実現するいくつかの手の込んだAPIがありますか?どんな助けでも大歓迎です。

答えて

7

これ以上のグーグル・グーグルの後、このhttp://www.rogueamoeba.com/utm/2007/09/29/はこの問題に対処しているようです。簡単な解決法はありませんが、実際のCocoaアプリケーションを開発している場合、これは少なくとも可能です。

+0

問題は、iTunesがこれらの鍵から反応するのを防ぐ方法がないことです。アプリケーションを制御するためにこれらの鍵を使用するのが賢明ではありません。 – adib

4

私の調査から、オペレーティングシステムは、他のプロセスが利用できるようになる前に、それらの重要なイベントをトラップしています。

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として実行する必要があるか、システム環境設定の「ユニバーサルアクセス」パネルで補助デバイスのアクセスをオンにする必要があることを忘れてしまいました。

+0

これは私が来たという結論でもありますが、iTunesは明らかにカーネルのどこかでiTunesのハードコードされた例外がない限り、iTunesにはっきりとフックされていますか?私は奇妙なことがわかります... – tryx

関連する問題