Вот мой код:
#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, но это не соответствует значению, указанному в перечислении.. что я - я пропавшие без вести??
Для изменения события существуют различные функции CGEventSet ... Чтобы убить событие, я думаю, ваша функция касания может просто вернуть NULL.
Перечисление для типов событий включает kCGEventFlagsChanged = NX_FLAGSCHANGED
. Если вы посмотрите IOKit / hidsystem / IOLLEvent.h, он определит NX_FLAGSCHANGED равным 12.