2016-04-19 10 views
11

キーボードに再生/一時停止/ etc(音楽制御ショートカット)のボタンがあり、それらを押すと、iTunesが開きます(少なくともMacでは)。Javaの音楽制御キーボードショートカットをインターセプトする方法は?

あなたは最近、別の音楽プレーヤーを開いた場合、Spotifyはのように、それは実際にショートカットキーを傍受し、iTunesは何もしません。

まあ、私はJavaで音楽プレーヤーを作りたいと思っています。私は同じ振る舞いをしたいと思います。私は自分のアプリケーションがそのようなショートカットを傍受し、他のプログラムが干渉できないようにしたい。

私はJavaFXを使用していますが、実際にはそれは重要ではないと思います。

どうすればこの問題を解決できますか?

私はすでにユーザーがJNativeHookを使用してキーを検出していますが、他のアプリケーションがそれらを使用しないようにキーを傍受する方法はわかりません。

+0

これは、Linux上でサポートされていない、しかし、あなたがWindowsとOS Xを参照の上、イベントを消費することができます。https://github.com/kwhat/jnativehook/wiki/ConsumingEvents –

答えて

4

一度キーを検出すると、一時停止キーを送信してiTunesで再生している曲を一時停止することができます。boolean変数を使用してキーボードで入力したショートカットとあなたが持っている可能性が Modify NSEvent to send a different key than the one that was pressedこっちプログラム

または

を(あなたが必要な場合は場合)あなたは、いくつかのCコードを使用することができますが(Javaプログラムと一緒にCプログラムを起動)@Dave Delongsの答えを見てみましょう別のキーボードショートカットを使用し、ショートカットキーを送信するためにcプログラムを変更します。キーコード012が必要な場合は、Itunesショートカットキーが押されています。例えば

あなたの音楽番組がp to play songsr to listen to the next songを使用し、iTunesが次のいずれかに行くために歌やright arrow keyを再生するためにspacebarを使用している場合、あなたは何ができる@Dave Delongsがここに答える変更の変更は以下のとおりです。 -

#import <Cocoa/Cocoa.h> 

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { 

//0x31 is the virtual keycode for "Spacebar" 
//0x23 is the virtual keycode for "p" 
    if (CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 0x31) { 
    CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, 0x23); 
    } 

//0x7C is the virtual keycode for "Right arrow" 
//0x0F is the virtual keycode for "R" 
    if (CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 0x7C) { 
    CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, 0x0F); 
    } 

    return event; 
} 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    CFRunLoopSourceRef runLoopSource; 

    CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, 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); 
    [pool release]; 

    exit(0); 
} 
1

あなたが探しているものを達成するためにiTunesPatchからコードの一部を使用することができるかもしれないが、システムデーモンは、インストール時に変更する必要があるかもしれないことが表示されます、あなたはおそらくのObjective-Cを使用する必要があります/迅速。

ブログ記事hereでiTunesPatchについての更なる詳細があります。

関連する問題