Я пытаюсь использовать события 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);
}
Эй, Дэвид, мне просто интересно, нужен ли основной поток для CGEventTapCreate, я искал способ отслеживать события мыши из основного потока. – Noitidart
Я не знаю, на самом деле, просто попробовал, чтобы он был в безопасности, если я правильно помню ... Попробуй еще одну тему и посмотри, что получится ... –
Спасибо! Я тестировал, и кажется, что у меня возникла проблема с циклом запуска: http://stackoverflow.com/q/33209518/1828637 – Noitidart