Сбой CGEventTapCreate и CFMachPortCreateRunLoopSource EXC_BAD_ACCESS

Я пытаюсь подключиться к скрытым событиям OSX. Я нашел фрагмент для тестирования. Однако мой код всегда кажется неудачным с EXC_BAD_ACCESS на CFMachPortCreateRunLoopSource линия. Кажется, что downEventTap нулевой. Чтение документации говорит мне, что это должно быть выполнено в главном потоке, я почти уверен, что я в основном потоке, и завершение dispatch_async(dispatch_get_main_queue(), ^{ все еще дает мне ноль. Я звоню слушать из приложения didFinishLaunching и добавил

@interface AppDelegate (){
  CFRunLoopSourceRef downSourceRef;
}

Вот как я думаю, что создание события событие должно быть сделано:

CGEventRef onKeyDown(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
  NSLog(@"DOWN (%lli)", CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode));
  // When it matches, I return CGEventCreate(NULL) to stop the event
  return event;
}
-(void)listen{

  CFMachPortRef downEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionDefault,CGEventMaskBit(kCGEventKeyDown),&onKeyDown,(__bridge void *)(self));
  downSourceRef = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, downEventTap, 0); //<-- Crash exc_bad_access: downEventTap = 0x0,downSourceRef= 0x0
  CFRelease(downEventTap);
  CFRunLoopAddSource(CFRunLoopGetCurrent(), downSourceRef, kCFRunLoopDefaultMode);
  CFRelease(downSourceRef);
}

1 ответ

Решение

Скорее всего, у вас нет разрешений, необходимых для касания события, которое заставляет CGEventTapCreate возвращать NULL, что приводит к тому, что CFMachPortCreateRunLoopSource вызывает segfault при попытке разыменования указанного NULL.

Другие вопросы по тегам