addLocalMonitorForEventsMatchingMask替代Off-mainthread

时间:2015-10-17 19:46:31

标签: objective-c multithreading core-foundation

我目前使用addLocalMonitorForEventsMatchingMask监视鼠标事件,我从主线程调用它。它很棒。但是我现在想把它移到主线程上。是否存在类似于从线程创建隐藏窗口并执行NSRunLoop

之类的替代方法

我在文档上阅读:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

  

总是在主线程上调用处理程序。两个类方法都返回监视对象,调用对象不拥有该监视对象(因此无需保留或释放)。

我可以从主线程做出任何替代方案吗?

我无法在另一个线程的主线程上设置回调。我现在使用的是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());

1 个答案:

答案 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}}