【发布时间】: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