[TRUKéASTUCE] Capturer les événements mouseMoved à  tout moment

BruBru 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 :
<br />#import &lt;Carbon/Carbon.h&gt;<br />#import &lt;ApplicationServices/ApplicationServices.h&gt;<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 />&nbsp; &nbsp; CGPoint cgp;<br />&nbsp; &nbsp; NSPoint nsp;<br /><br />&nbsp; &nbsp; // récupération des coordonnées de la souris<br />&nbsp; &nbsp; cgp=CGEventGetLocation(event);<br /><br />&nbsp; &nbsp; // transformation des coordonnées CG en coord NS<br />&nbsp; &nbsp; nsp.x=cgp.x;<br />&nbsp; &nbsp; nsp.y=cgp.y;<br /><br />&nbsp; &nbsp; // appel de la méthode tapMouseMoved du contrôleur<br />&nbsp; &nbsp; [controleur tapMouseMoved:nsp];<br /><br />&nbsp; &nbsp; return NULL;<br />}<br /><br /><br />@implementation Controleur<br /><br />- (void)awakeFromNib<br />{<br />&nbsp; &nbsp; // creation du tap qui observera les mouvements de la souris<br />&nbsp; &nbsp; evtap=CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventMouseMoved), TapMouseMoved, self);<br /><br />&nbsp; &nbsp; // installation du tap dans le runloop<br />&nbsp; &nbsp; source=CFMachPortCreateRunLoopSource(kCFAllocatorDefault, evtap, 0);<br />&nbsp; &nbsp; CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);<br /><br />&nbsp; &nbsp; // démarrage de l&#39;observation du tap<br />&nbsp; &nbsp; CGEventTapEnable(evtap, YES);<br />}<br /><br />- (void)tapMouseMoved:(NSPoint)point<br />{<br />&nbsp; &nbsp; NSLog(@&quot;coords souris:%@&quot;, 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).

.

Réponses

  • elfelf Membre
    07:40 modifié #2
    Donc en fait, ta méthode pourrais être utilisé pour créer une hotkey globale, non?

    (Je sais que y'a plus facile, mais c'est juste pour interêt)
  • BruBru Membre
    07:40 modifié #3
    dans 1183507722:

    Donc en fait, ta méthode pourrais être utilisé pour créer une hotkey globale, non?


    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é.

    .
  • schlumschlum Membre
    07:40 modifié #4
    Hotkey, ou plus dangereux... un keystroke logger  B)
  • elfelf Membre
    07:40 modifié #5
    Ah ouais, un keylogger... Mais il y a aussi des avantages à  avoir un keylogger bienveillant!
Connectez-vous ou Inscrivez-vous pour répondre.