Я использую CGEventTapCreate
для «кражи» медиа-ключей из iTunes во время работы моего приложения. Код внутри обратного вызова, который я передаю CGEventTapCreate
, проверяет событие и, если обнаруживает, что это один из мультимедийных ключей, отправляет соответствующее уведомление в центр уведомлений по умолчанию.
Теперь это отлично работает, если я публикую уведомление о событии «нажатие клавиши». Если я сделаю это для событий «key down», в конечном итоге мое приложение перестанет получать события мультимедийных клавиш, и iTunes вступит во владение. Любые идеи о том, что может быть причиной этого? Соответствующая часть кода ниже
enum {
...
PlayPauseKeyDown = 0x100A00,
PlayPauseKeyUp = 0x100B00,
...
};
static CGEventRef event_tap_callback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
if (!(type == NX_SYSDEFINED) || (type == NX_KEYUP) || (type == NX_KEYDOWN))
return event;
NSEvent* keyEvent = [NSEvent eventWithCGEvent: event];
if (keyEvent.type != NSSystemDefined) return event;
switch(keyEvent.data1)
{
case PlayPauseKeyUp: // <--- this works reliably
//case PlayPauseKeyDown: // <--- this will break eventually
post_notification(@"PlayPauseMediaKeyPressed", nil, nil);
return NULL;
... and so on ...