2016-04-19 9 views
11

यदि आपके कीबोर्ड में play/pause/etc (संगीत नियंत्रण शॉर्टकट्स) के लिए बटन हैं, और आप उन्हें दबाते हैं, तो iTunes खुल जाएगा (कम से कम मैक पर)।जावा में संगीत नियंत्रण कीबोर्ड शॉर्टकट को कैसे रोकें?

यदि आपने हाल ही में Spotify की तरह एक और संगीत खिलाड़ी खोला है, तो यह वास्तव में शॉर्टकट कुंजियों को रोक देगा, और आईट्यून्स कुछ भी नहीं करेंगे।

ठीक है, मैं जावा के साथ एक संगीत खिलाड़ी बनाना चाहता हूं, और मैं वही व्यवहार करना चाहता हूं। मैं चाहता हूं कि मेरा एप्लिकेशन ऐसे शॉर्टकट को रोकें, और अन्य प्रोग्राम हस्तक्षेप करने में सक्षम नहीं होना चाहिए।

मैं जावाएफएक्स का उपयोग कर रहा हूं, हालांकि मुझे नहीं लगता कि वास्तव में मायने रखता है।

मैं इसे कैसे प्राप्त कर सकता हूं?

मैं पहले से ही JNativeHook का उपयोग कर उपयोगकर्ता प्रेस की चाबियों का पता लगाने में सक्षम हूं, लेकिन मुझे नहीं पता कि चाबियों को कैसे रोकें ताकि अन्य एप्लिकेशन उनके साथ काम न करें।

+0

यह लिनक्स पर समर्थित नहीं है, लेकिन आप विंडोज़ और ओएस एक्स पर घटनाओं का उपभोग कर सकते हैं देखें: https://github.com/kwhat/jnativehook/wiki/ConsumingEvents –

उत्तर

4

एक बार जब आप कुंजी का पता लगाने, आप तो यह है कि गीत है कि iTunes द्वारा खेला जा रहा रोक दिया गया है, तो आप शॉर्टकट, कीबोर्ड पर टाइप किया जा रहा या द्वारा भेज दिया जा रहा के बीच का पता लगाने के एक boolean चर इस्तेमाल कर सकते हैं ठहराव कुंजी भेज सकता है कार्यक्रम (मामले अगर आप की जरूरत है)

या

आप कुछ ग कोड इस्तेमाल कर सकते हैं (अपने जावा कार्यक्रम के साथ ग कार्यक्रम शुरू) यहाँ Modify NSEvent to send a different key than the one that was pressed से अधिक @Dave Delongs जवाब पर एक नज़र तुम एक हो सकता था अलग-अलग कीबोर्ड शॉर्टकट और सी प्रोग्राम को अपनी शॉर्टकट कुंजियां भेजने के लिए संशोधित करें जबकि इट्यून्स शॉर्टकट कुंजियां दबाई जाती हैं, अगर आपको कुंजी कोड 012 की आवश्यकता है

उदाहरण के लिए

अपने संगीत कार्यक्रम p to play songs और r to listen to the next song का उपयोग करता है, और iTunes spacebarright arrow key का उपयोग करता गाने खेलने के लिए और अगले एक पर जाने के लिए, आप संपादित कर सकता सकता है @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 से कुछ कोड का उपयोग करने में सक्षम हो सकते हैं, लेकिन ऐसा लगता है कि एक सिस्टम डिमन को इंस्टॉलेशन पर संशोधित करने की आवश्यकता हो सकती है, और आपको ऑब्जेक्टिव-सी/स्विफ्ट।

ब्लॉग पोस्ट here में iTunesPatch के बारे में और जानकारी है।

संबंधित मुद्दे