[TRUKéASTUCE] Capturer les événements mouseMoved à tout moment
Bru
Membre
Une des nouveautés de 10.4, c'est la gestion des event taps. Il s'agit de pouvoir observer (ou même intercepter/modifier) n'importe quel événement au niveau du window-server avant d'être distribué à l'appli en premier temps.
L'avantage des event taps est que cela permet de voir les événements, même si l'appli qui observe n'est pas au premier temps (voire si elle est helper ou en background).
Ci-après, un exemple qui monitore les mouvements de la souris dans une simple appli cocoa :
La méthode tapMouseMoved: de la classe "contrôleur" sera appelée à chaque mouvement de la souris, même si l'appli n'est pas au premier temps.
La position de la souris est en coordonnées haut-gauche (le point 0,0 est en haut à gauche).
.
L'avantage des event taps est que cela permet de voir les événements, même si l'appli qui observe n'est pas au premier temps (voire si elle est helper ou en background).
Ci-après, un exemple qui monitore les mouvements de la souris dans une simple appli cocoa :
<br />#import <Carbon/Carbon.h><br />#import <ApplicationServices/ApplicationServices.h><br /><br />static CFMachPortRef evtap;<br />static CFRunLoopSourceRef source;<br /><br />// fonction callback appelée à chaque événement mouse-moved<br /><br />CGEventRef TapMouseMoved(CGEventTapProxy proxy, CGEventType type, CGEventRef event, id controleur)<br />{<br /> CGPoint cgp;<br /> NSPoint nsp;<br /><br /> // récupération des coordonnées de la souris<br /> cgp=CGEventGetLocation(event);<br /><br /> // transformation des coordonnées CG en coord NS<br /> nsp.x=cgp.x;<br /> nsp.y=cgp.y;<br /><br /> // appel de la méthode tapMouseMoved du contrôleur<br /> [controleur tapMouseMoved:nsp];<br /><br /> return NULL;<br />}<br /><br /><br />@implementation Controleur<br /><br />- (void)awakeFromNib<br />{<br /> // creation du tap qui observera les mouvements de la souris<br /> evtap=CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventMouseMoved), TapMouseMoved, self);<br /><br /> // installation du tap dans le runloop<br /> source=CFMachPortCreateRunLoopSource(kCFAllocatorDefault, evtap, 0);<br /> CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);<br /><br /> // démarrage de l'observation du tap<br /> CGEventTapEnable(evtap, YES);<br />}<br /><br />- (void)tapMouseMoved:(NSPoint)point<br />{<br /> NSLog(@"coords souris:%@", NSStringFromPoint(point));<br />}<br /><br />@end<br />
La méthode tapMouseMoved: de la classe "contrôleur" sera appelée à chaque mouvement de la souris, même si l'appli n'est pas au premier temps.
La position de la souris est en coordonnées haut-gauche (le point 0,0 est en haut à gauche).
.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
(Je sais que y'a plus facile, mais c'est juste pour interêt)
Oui.
Effectivement, les événements keyDown et keyUp sont monitorables.
Mais pour observer ces événements, il faut par contre que l'option "Activer l'accès pour les périphériques d'aide" du panel de préférence "Accès universel" soit coché.
.