如何拦截Java中的音乐控制键盘快捷键?

Vol*_*ort 11 java keyboard keyboard-shortcuts keyboard-events

如果键盘上有播放/暂停/等按钮(音乐控制快捷键),按下它们,iTunes将打开(至少在Mac上).

如果你最近打开了另一个音乐播放器,比如Spotify,它实际上会截取快捷键,iTunes也不会做任何事情.

好吧,我想制作一个带有Java的音乐播放器,我希望有相同的行为.我希望我的应用程序拦截这样的快捷方式,其他程序不应该干涉.

我正在使用JavaFX,虽然我认为这不重要.

我怎样才能做到这一点?

我已经能够检测到用户使用JNativeHook按下的键,但我不知道如何拦截键,以便其他应用程序不会使用它们.

小智 4

一旦检测到按键,您可以发送暂停键,以便暂停 itunes 正在播放的歌曲,您可以使用变量boolean来检测键盘上键入的快捷键或程序发送的快捷键(如果你需要)

或者

您可以使用一些c代码(与您的java程序一起启动c程序)看看@Dave Delongs在这里的答案修改NSEvent以发送与按下的键不同的键 您可以有不同的键盘快捷键并修改c 程序在按下 Itunes 快捷键时发送快捷键,如果您需要按键代码在哪里可以找到 Mac 虚拟按键代码列表?

例如,如果您的音乐程序使用p to play songsr to listen to the next song,并且 itunes 使用spacebar来播放歌曲并right 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);
}
Run Code Online (Sandbox Code Playgroud)