CGEventTapCreate以"关键"事件神秘地崩溃

svi*_*tus 6 macos cocoa macos-carbon core-foundation

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 ...
Run Code Online (Sandbox Code Playgroud)

JWW*_*ker 9

如果回调花费太长时间,有什么东西可以杀死我的事件?

有些人怀疑Snow Leopard有一个有时会禁用事件点击的错误,即使他们不花太长时间.要处理此问题,您可以查看事件类型kCGEventTapDisabledByTimeout,并通过重新启用您的点按来进行响应CGEventTapEnable.