CGEventTapCreate загадочно ломается с событиями «ключ вниз»

я используюCGEventTapCreate «украсть» медиа-ключи из iTunes, когда мое приложение работает. Код внутри обратного вызова, который я передаюCGEventTapCreate исследует событие и, если обнаружит, что это один из ключей мультимедиа, отправляет соответствующее уведомление в центр уведомлений по умолчанию.

Теперь это работает нормально, если я опубликую уведомление о событии «key up». Если я делаю это для событий «нажатие клавиши», в конце концов мое приложение перестает получать события медиа-клавиш, и 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 ...

Ответы на вопрос(2)

Ваш ответ на вопрос