2016-04-19 20 views
11

Nếu bàn phím của bạn có các nút để phát/tạm dừng/etc (phím tắt điều khiển nhạc), và bạn bấm chúng, iTunes sẽ mở (ít nhất là trên máy Mac).Làm cách nào để chặn các phím tắt điều khiển nhạc trong Java?

Nếu gần đây bạn đã mở một trình phát nhạc khác, như Spotify, nó sẽ thực sự chặn các phím tắt và iTunes sẽ không làm bất cứ điều gì.

Vâng, tôi muốn tạo trình phát nhạc bằng Java và tôi muốn có hành vi tương tự. Tôi muốn ứng dụng của mình chặn các lối tắt như vậy và các chương trình khác không thể can thiệp.

Tôi đang sử dụng JavaFX, mặc dù tôi không nghĩ rằng điều đó thực sự quan trọng.

Tôi làm cách nào để đạt được điều này?

Tôi đã có thể phát hiện khóa của họ mà người dùng nhấn bằng cách sử dụng JNativeHook, nhưng tôi không biết cách chặn các khóa để các ứng dụng khác không làm việc với chúng.

+0

Nó không được hỗ trợ trên Linux, nhưng bạn có thể sử dụng các sự kiện trên Windows và OS X Xem: https://github.com/kwhat/jnativehook/wiki/ConsumingEvents –

Trả lời

4

Khi bạn phát hiện các phím, bạn có thể gửi phím tạm dừng để bài hát đang được itunes phát bị tạm dừng, bạn có thể sử dụng biến số boolean để phát hiện giữa các phím tắt được nhập trên bàn phím hoặc được gửi bởi chương trình (trong trường hợp nếu bạn cần)

hoặc

bạn có thể sử dụng một số mã c (khởi động chương trình c cùng với chương trình java của bạn) hãy xem @ Dave Delongs câu trả lời qua đây Modify NSEvent to send a different key than the one that was pressed bạn có thể có một phím tắt khác nhau và sửa đổi chương trình c để gửi các phím tắt của bạn trong khi các phím Phím tắt Itunes được nhấn, nếu bạn cần mã khóa Where can I find a list of Mac virtual key codes?

ví dụ nếu chương trình âm nhạc của bạn sử dụng p to play songsr to listen to the next song, và itunes sử dụng spacebar để chơi các bài hát và right arrow key để đi đến một hôm sau, bạn có thể làm thay đổi @ Dave Delongs trả lời ở đây là những thay đổi: -

#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

Bạn có thể sử dụng một số mã từ iTunesPatch để hoàn thành những gì bạn đang tìm kiếm, nhưng có vẻ như một daemon hệ thống có thể cần được sửa đổi khi cài đặt và bạn có thể phải sử dụng Objective-C/Nhanh.

Có thêm chi tiết về iTunesPatch trong bài đăng trên blog here.

Các vấn đề liên quan