OSX Quartz Event Taps: типы событий и способы редактирования событий

Вот мой код:

#import <ApplicationServices/ApplicationServices.h>

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type,  CGEventRef event, void *refcon) {
 printf("%u\n", (uint32_t)type);
 return event; 
}

int main (int argc, const char * argv[]) {
 CFMachPortRef eventTap;  
 CFRunLoopSourceRef runLoopSource; 

 eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, kCGEventMaskForAllEvents, myCGEventCallback, NULL);
 runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
 CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
 CGEventTapEnable(eventTap, true);
 CFRunLoopRun();
    return 0;
}

Во-первых ... что, если бы я хотел отредактировать событие? Например, я слушаю событие keyDown, и если это «a», я переворачиваю его на «b», или редактирую положение мыши в реальном времени, или, например, просто захватываю событие и делаю его неэффективным (отключение определенного ключ например ..)

Во-вторых ... CGEventType определяется перечислением, в котором перечислено только несколько типов ... например, когда я нажимаю CMD, я получаю 12, но это не соответствует значению, указанному в перечислении ... что мне не хватает ??


person luca    schedule 21.11.2009    source источник
comment
Хорошо ответил Дэйв Делонг здесь: stackoverflow.com/questions/5785630/   -  person ck_    schedule 29.08.2011


Ответы (1)


Для изменения события существуют различные функции CGEventSet ... Чтобы убить событие, я думаю, ваша функция касания может просто вернуть NULL.

Перечисление типов событий включает kCGEventFlagsChanged = NX_FLAGSCHANGED. Если вы посмотрите IOKit / hidsystem / IOLLEvent.h, он определяет NX_FLAGSCHANGED как 12.

person JWWalker    schedule 04.07.2010