Как перехватить музыкальные клавиши быстрого доступа на Java?

Если на клавиатуре есть кнопки для воспроизведения/паузы/и т.д. (ярлыки управления музыкой), и вы нажимаете на них, iTunes откроется (по крайней мере, на Mac).

Если вы недавно открыли другой музыкальный плеер, например Spotify, он фактически перехватит сочетания клавиш, и iTunes ничего не сделает.

Ну, я хочу создать музыкальный плеер с Java, и я хочу иметь такое же поведение. Я хочу, чтобы мое приложение перехватывало такие ярлыки, а другие программы не могли вмешиваться.

Я использую JavaFX, хотя я не думаю, что это действительно важно.

Как я могу это достичь?

Я уже могу определить, какие клавиши они нажимают на пользователя, используя JNativeHook, но я не знаю, как перехватить ключи, чтобы другие приложения не делайте с ними вещи.

Ответ 1

Как только вы обнаружите ключи, вы можете отправить клавишу паузы, чтобы песня, которую воспроизводит itunes, приостановлена, вы можете использовать переменную boolean для обнаружения между ярлыками, набираемыми на клавиатуре, или отправкой программа (в случае необходимости)

или

Вы можете использовать некоторый c-код (запустите программу c вместе с вашей java-программой), посмотрите на @Dave Delongs ответ здесь Измените NSEvent на отправку другого ключа, кроме одного который был нажат У вас может быть другая комбинация клавиш и изменение программы c для отправки ваших сочетаний клавиш, когда нажаты клавиши быстрого доступа Itunes, если вам нужны коды клавиш Где я могу найти список виртуальных виртуальных машин Mac коды клавиш?

например, если ваша музыкальная программа использует p to play songs и r 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);
}

Ответ 2

Вы можете использовать некоторый код из iTunesPatch, чтобы выполнить то, что вы ищете, но похоже, что системный демон может потребоваться изменить при установке, и вам, вероятно, придется использовать Objective-C/Swift.

Более подробную информацию о iTunesPatch можно найти в сообщении в блоге здесь.