CGEventTapCreate和CFMachPortCreateRunLoopSource失败EXC_BAD_ACCESS

时间:2015-03-13 09:24:14

标签: xcode macos keyboard-events cgeventtap media-keys

我正试图利用OSX的HID事件。我找到了一个测试它的片段。但是,我的代码似乎总是在CFMachPortCreateRunLoopSource行的EXC_BAD_ACCESS失败。似乎downEventTap为空。阅读文档告诉我,这需要在主线程上运行,我很确定我在主线程上,并且在dispatch_async(dispatch_get_main_queue(), ^{中包装内容仍然为null。我正在呼叫应用程序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 个答案:

答案 0 :(得分:1)

您很可能没有点击导致CGEventTapCreate返回NULL的事件所需的权限,这会导致CFMachPortCreateRunLoopSource在尝试取消引用所述NULL时出现段错误。