Sous Windows, les actions de l'utilisateur, clavier, souris, etc. sont converties en des messages placés dans des files. Un mécanisme très intéressant, les « hook », permet d'intervenir sur les files de messages.
Pour qu'un système multitâche puisse fonctionner, il doit traiter les événements de manière asynchrone. En effet, ces événements survenant à des moments imprévisibles, il n'est pas question d'attendre qu'ils se produisent sous peine de bloquer le système entier. Les événements susceptibles d'être gérés par le système sont très nombreux. Les actions physiques de l'utilisateur sur le clavier et la souris sont les plus évidents, et ce sont eux qui nous intéressent aujourd'hui. Schématiquement, Windows résout le problème de ces événements en les plaçant à la queue leu leu dans une file. Un thread du système dispatche ensuite chaque évènement relatif à une application dans une autre file, dédiée à l'application concernée. L'application, dans son thread principal, à charge de "pomper" les événements, c'est-à-dire de les retirer de sa file, et d'y réagir de la façon appropriée dans sa procédure de fenêtre. Il est possible de suivre tout ce trafic de messages et même d'intervenir dessus, au moyen des hooks. Les hooks sont de petites fonctions que l'on installe par programmation, et qui sont appelées par le système qui leur passe les messages de la file qui les concerne. Travailler avec les hooks est amusant, et permet de donner libre cours à son imagination, pour le meilleur et pour le pire. C'est ainsi que les keyloggers, programmes généralement malveillants, utilisent le principe des hooks pour enregistrer les saisies claviers d'un utilisateur. Nous allons, quant à nous, jouer avec les messages de la souris dans cet article, notamment pour en rejouer les déplacements après coup. Mais si vous souhaitez coder un keylogger (pour une raison louable bien sûr !), nos exemples seront facilement adaptables. Nos exemples ont été écrits en C++ avec Visual Studio 2008. Vous les adapterez facilement à votre compilateur préféré. Le seul point un petit peu difficile est, éventuellement, l'édition de liens dynamique avec les librairies dll, ainsi que nous le verrons plus loin. Pour cet article, nous supposons que le lecteur dispose déjà de solides bases en programmation Win32.
Frédéric Mazué