2009-06-27 5 views
6

Я довольно новичок в разработке OSX, так что это может быть легко, но google не помог.Связывание с медиа-ключами на клавиатурах Apple под OSX 10.5

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

ответ

7

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

+0

Проблема в том, что iTunes не может реагировать на эти ключи - это неразумно использовать эти клавиши для управления вашим приложением. – adib

4

Из моих исследований операционная система захватывает эти ключевые события, прежде чем они будут доступны для других процессов. Я создал 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»), но при нажатии на клавиши мультимедиа, клавиши яркости, громкости или выталкивания ничего не регистрируется.

Таким образом, к сожалению, похоже, что невозможно зафиксировать событие медиа-ключа. Однако я хотел бы, чтобы меня оправдали.

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

+0

Это также вывод, к которому я пришел, однако iTunes явно подключается к нему. Если не существует жестко закодированного исключения для iTunes где-то глубоко в ядре? Я бы нашел, что нечетно ... – tryx

 Смежные вопросы

  • Нет связанных вопросов^_^