2015-03-13 4 views
1

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

@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); 
} 
+0

Эй, Дэвид, мне просто интересно, нужен ли основной поток для CGEventTapCreate, я искал способ отслеживать события мыши из основного потока. – Noitidart

+1

Я не знаю, на самом деле, просто попробовал, чтобы он был в безопасности, если я правильно помню ... Попробуй еще одну тему и посмотри, что получится ... –

+0

Спасибо! Я тестировал, и кажется, что у меня возникла проблема с циклом запуска: http://stackoverflow.com/q/33209518/1828637 – Noitidart

ответ

1

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

+0

http://stackoverflow.com/questions/12419988/global-events-the-mac-app-store-and-the-sandbox –

 Смежные вопросы

  • Нет связанных вопросов^_^