2009-11-21 14 views
5

Voici mon code:OSX Quartz Taps événement: types d'événements et comment modifier les événements

#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; 
} 

d'abord .. si je voulais modifier l'événement? Par exemple j'écoute l'événement keyDown et si c'est un "a" je le tourne dans un "b", ou édite la position de la souris en temps réel, ou par exemple capture simplement un évènement et le rend sans effet (désactivant un clé par exemple ..)

Deuxième ... CGEventType est défini avec une énumération qui ne liste que quelques types. Par exemple, lorsque je clique sur CMD, j'obtiens un 12, mais cela ne correspond pas à la valeur spécifiée dans l'énumération .. qu'est-ce que je manque?

+0

bien répondu par Dave DeLong ici: http://stackoverflow.com/questions/5785630/modify-nsevent-to -send-a-différent-clé-que-celui-qui-était-pressé/5785895 # 5785895 – cksubs

Répondre

2

Pour modifier un événement, il existe différentes fonctions CGEventSet .... Pour tuer l'événement, je pense que votre fonction tap peut juste retourner NULL.

L'énumération pour les types d'événement inclut kCGEventFlagsChanged = NX_FLAGSCHANGED. Si vous regardez IOKit/hidsystem/IOLLEvent.h, il définit NX_FLAGSCHANGED être 12.