我目前使用addLocalMonitorForEventsMatchingMask监视鼠标事件,我从主线程调用它。它很棒。但是我现在想把它移到主线程上。是否存在类似于从线程创建隐藏窗口并执行NSRunLoop
?
总是在主线程上调用处理程序。两个类方法都返回监视对象,调用对象不拥有该监视对象(因此无需保留或释放)。
我可以从主线程做出任何替代方案吗?
我无法在另一个线程的主线程上设置回调。我现在使用的是FFI,而且现在还不能用它。
这是我的代码以防它有用,但我希望替代这个替代主要线程请:
myHandler_js = function(c_arg1__self, objc_arg1__aNSEventPtr) {
var cType = ostypes.API('objc_msgSend')(objc_arg1__aNSEventPtr, ostypes.HELPER.sel('type'));
cType = ctypes.cast(cType, ostypes.TYPE.NSEventType);
return objc_arg1__aNSEventPtr; // return null to block
};
myHandler_c = ostypes.TYPE.IMP_for_EventMonitorCallback.ptr(myHandler_js);
myBlock_c = ostypes.HELPER.createBlock(myHandler_c);
var rez_add = ostypes.API('objc_msgSend')(ostypes.HELPER.class('NSEvent'), ostypes.HELPER.sel('addLocalMonitorForEventsMatchingMask:handler:'), ostypes.TYPE.NSEventMask(ostypes.CONST.NSKeyDownMask), myBlock_c.address());
答案 0 :(得分:0)
解决方案是使用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 :(
}
}
。
这个有问题,但是一旦准备好就立即更新:
{{1}}