【问题标题】:CGEventTapCreate and CFMachPortCreateRunLoopSource fails EXC_BAD_ACCESSCGEventTapCreate 和 CFMachPortCreateRunLoopSource 失败 EXC_BAD_ACCESS
【发布时间】:2015-05-15 17:24:51
【问题描述】:

我正在尝试利用 OSX 的 HID 事件。我找到了一个 sn-p 来测试它。但是,我的代码似乎总是在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);
}

【问题讨论】:

  • 嘿,大卫,我只是想知道 CGEventTapCreate 是否需要主线程,我正在寻找一种从主线程之外监视鼠标事件的方法。
  • 我其实不知道,如果我没记错的话,只是为了安全起见……尝试另一个线程,看看会发生什么……
  • 谢谢!我测试过,运行循环有问题似乎没问题:stackoverflow.com/q/33209518/1828637
  • @DavidKarlsson 那么,解决方法是什么?

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


【解决方案1】:

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

猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多