2015-10-17 4 views
0

В настоящее время я использую addLocalMonitorForEventsMatchingMask для отслеживания событий мыши, и я называю это из основного потока. Он отлично работает. Однако теперь я хочу переместить его в основной поток. Есть ли альтернатива, вроде создания скрытого окна из потока и выполнения NSRunLoop?addLocalMonitorForEventsMatchingMask Альтернатива для Off-mainthread

Я прочитал на документы: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

обработчики всегда вызываются в основном потоке. Оба метода класса возвращают объект-монитор, который вызывающий объект не имеет (и, следовательно, ему не нужно сохранять или освобождать).

Есть ли альтернатива, которую я могу сделать с главной темы?

Я не могу настроить обратные вызовы на mainthread из другого потока. Я использую 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

Решение заключается в использовании CGEventTap.

Это один испытывает проблемы, но Ill обновление, как только его готов:

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 :(

     } 

}