Привязка к мультимедийным клавишам на клавиатурах Apple под управлением OSX 10.5 [закрыто]

StackOverflow https://stackoverflow.com/questions/1053351

  •  20-08-2019
  •  | 
  •  

Вопрос

Я довольно новичок в разработке OSX, так что это может быть легко, но Google не помог.

Я пытаюсь привязать действие к мультимедийным клавишам, которые вы найдете на новых клавиатурах Apple (воспроизведение, пауза и т.д.).Похоже, что вы не можете привязаться к этим клавишам с помощью обычного API горячих клавиш, но это должно быть возможно, поскольку iTunes четко управляет.Есть ли какой-нибудь хитрый недокументированный API, который достигает этого?Любая помощь была бы высоко оценена.

Это было полезно?

Решение

После более тщательного поиска в Google, этот http://www.rogueamoeba.com/utm/2007/09/29/ кажется, это решает проблему.Простого решения не существует, но если вы разрабатываете настоящее приложение Cocoa, это, по крайней мере, кажется возможным.

Другие советы

Из моих исследований следует, что операционная система улавливает эти ключевые события до того, как они станут доступны другим процессам.Я создал CGEventTap, вот так:

int main(int argc, char *argv[]) {
CFMachPortRef      eventTap;
CFRunLoopSourceRef runLoopSource;

eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, 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);

exit(0);

}

И тогда фактический обратный вызов события выглядит следующим образом:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    if (type == kCGEventKeyUp) {
        CGKeyCode keycode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);
        NSLog(@"%d", keycode);
    }

    return event;
}

То, что вы видите вошедшим в консоль, - это то, что вы получаете обычные методы ведения журнала для функциональных клавиш (если вы также удерживаете нажатой клавишу "fn"), но при нажатии клавиш мультимедиа, яркости, громкости или извлечения, ничего регистрируется.

Итак, из этого, к сожалению, следует, что нет никакого способа захватить событие медиа-ключа.Однако мне бы очень хотелось, чтобы мне доказали обратное.

Редактировать:Я забыл указать, что для того, чтобы это сработало, оно должно либо запускаться от имени root, либо вам нужно включить доступ для вспомогательных устройств на панели "Универсальный доступ" системных настроек.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top