我创建了这样一个CGEventTap:
GetCurrentProcess(psn);
var mask = 1 << kCGEventLeftMouseDown | // CGEventMaskBit(kCGEventLeftMouseDown)
1 << kCGEventLeftMouseUp |
1 << kCGEventRightMouseDown |
1 << kCGEventRightMouseUp |
1 << kCGEventOtherMouseDown |
1 << kCGEventOtherMouseUp |
1 << kCGEventScrollWheel;
mouseEventTap = CGEventTapCreateForPSN(&psn, kCGHeadInsertEventTap, kCGEventTapOptionDefault, mask, null);
if (!mouseEventTap.isNull()) {
aRLS = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mouseEventTap, 0);
CFRelease(mouseEventTap);
if (!aRLS.isNull()) {
aLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource(aLoop, aRLS, kCFRunLoopCommonModes);
CFRelease(aRLS);
CFRelease(aLoop);
rez = CFRunLoopRunInMode(ostypes.CONST.kCFRunLoopCommonModes, 10, false); // figure out how to make this run indefinitely
// rez is 1 :(
}
}我的CFRunLoopRun立即退出,而不是运行10秒。它说代码是1,这意味着在这种模式下没有源。但我显然对公共模式选项kCFRunLoopRunFinished. The run loop mode mode has no sources or timers.做了一个kCFRunLoopRunFinished. The run loop mode mode has no sources or timers.。有人知道怎么回事吗?这是在非主线程上。
发布于 2015-10-21 12:50:32
您不能在kCFRunLoopCommonModes中运行运行循环。CFRunLoopRunInMode()文档中清楚地说明了这一点。
kCFRunLoopCommonModes是一种虚拟模式。它基本上是一组其他的模式。它只能在向run循环中添加(或移除)源时使用,以表示“当run循环在集合中的任何模式下运行时监视此源”。但是当您运行一个run循环时,您必须在一个特定的真实模式下运行它,而不是这个表示一组其他模式的虚拟模式。
我建议,当您处理私有线程并且只希望监视私有源时,请将源添加到自定义模式并在该模式下运行run循环。自定义模式只是一个具有唯一值的字符串。例如,类似于"com.yourcompany.yourproject.yourmodespurpose".的东西使用自定义模式可以确保run循环不会做任何意外的事情,比如触发框架添加的源。
您不能发布aLoop。在它们的名字中没有“创建”或“复制”的函数不会给你所有权。
对CFRunLoopRunInMode()的调用需要循环,因为每次从源处理事件(kCFRunLoopRunHandledSource == 4)或按超时(kCFRunLoopRunTimedOut == 3)时,它都会返回。如果它返回其他任何内容,则应该从循环中脱离出来。
https://stackoverflow.com/questions/33209518
复制相似问题