Сбой 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.