Controle Clavier Souris
Controle Clavier Souris
Controle Clavier Souris
I - Introduction..............................................................................................................................................................3
II - Rappels sur la file de message Windows............................................................................................................. 3
III - Dmarche de la simulation par la file de messages Windows.............................................................................5
III-A - Rcuprer le handle de la fentre au premier plan.....................................................................................5
III-B - Rcuprer le handle d'une fentre prcise..................................................................................................5
III-C - Les diffrents messages pour le clavier et la souris................................................................................... 6
III-C-1 - Le clavier :........................................................................................................................................... 6
III-C-2 - La souris :............................................................................................................................................6
III-D - Comment envoyer un message...................................................................................................................6
III-D-1 - Le clavier :........................................................................................................................................... 6
III-D-2 - La souris :............................................................................................................................................8
IV - Prendre le contrle du clavier et de la souris...................................................................................................... 9
IV-A - Le clavier dans tous ses tats.................................................................................................................... 9
IV-B - Les poules picorent, la souris cliquette..................................................................................................... 10
IV-B-1 - Dplacer le curseur :.........................................................................................................................10
IV-B-2 - Simuler les clicks et la mollette........................................................................................................ 11
IV-B-3 - Ciblage d'une fentre spcifique avec la fonction de contrle du clavier......................................... 12
IV-B-4 - Trouver le class name d'une fentre quelconque.............................................................................13
IV-B-5 - Qu'est-ce qu'un hook ?..................................................................................................................... 13
IV-B-6 - Les diffrents types de hooks...........................................................................................................14
IV-B-7 - Prrequis la mise en place d'un hook........................................................................................... 15
IV-B-8 - Mise en place d'un hook...................................................................................................................15
V - Divers problmes et leur voie de rsolution....................................................................................................... 19
VI - Les hooks........................................................................................................................................................... 20
-2Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
I - Introduction
Depuis ces dernires annes, les applications multimdias fleurissent foison : lecteurs MP3, DVD, DivX et autres
logiciels de TV sont dsormais monnaie courrante sur les ordinateurs personnels qui autrefois taient destinns
installer Office et le dernier jeu la mode. Si les interfaces sont de plus en plus conviviales, elles ncessitent toujours
que l'utilisateur vienne interagir soit avec le clavier, soit avec la souris pour raliser les oprations usuelles telles que
lecture, pause, rembobinage, changement de chaines, etc ... Nous avons donc vu apparatre des claviers multimdia
aux merveilleuses touches complmentaires pour s'occuper de ces fonctions (comme si 105 touches c'tait pas
assez ! ;-) ). Cependant, si on regarde bien, la prise en charge de ces touches par les applications n'est pas toujours
implmente et quand elle l'est, elle ne l'est pas toujours correctement. En effet, il arrive que certaines applications
ragissent ou non suivant le mdia lu ou suivant le temps coul depuis la dernire "vraie" action du clavier ou de la
souris. Les dveloppeurs ont donc eu l'ide de simuler les racourcis claviers des applications multimdia pour mieux
se faire comprendre des applications. Cependant, il n'est pas toujours vident de raliser cette simulation et c'est
pourquoi nous allons diviser cette tude en deux parties : simulation par la file de message de Windows et prendre
le contrle du clavier et de la souris
-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
-4Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
A chaque pression d'une touche, Windows va envoyer trois messages au navigateur : WM_KEYDOWN qui va
indiquer qu'une touche a t enfonce, WM_CHAR qui va prciser qu'un caractre t donn l'application et
finalement WM_KEYUP qui va indiquer que la touche a t relache. Chacun des ces messages est plac dans
la file de messages du navigateur qui va les analyser un un. Imaginons qu'il ne se proccupe que du message
WM_CHAR et qu'il ignore les autres. A chacun de ces messages, il va analyser les informations fournies par windows
en complment du message et ajouter le caractre indiqu la chaine de caractres reprsentant l'URL de la
ressource dsire. Au moment ou il va recevoir le caractre "ENTREE", il va lancer la recherche.
L'intert d'une telle tude est de comprendre par quel moyen on va pouvoir dire a une application multimdia (ou une
autre, mais l'intert serait plus limit) "l'utilisateur a press la touche X : lance la lecture". En effet, vous l'avez surement
remarqu, la majorit des applications met notre disposition des racourcis clavier pour accder rapidement aux
principales fonctionnalits ; nous allons les simuler afin de contrler les applications.
http://tcharles.developpez.com/simul/
return 0;
III-C-1 - Le clavier :
WM_KEYDOWN : c'est le premier message qu'envoie Windows une application lorsqu'on enfonce une touche du
clavier.
WM_CHAR : il est envoy au moment ou WM_KEYDOWN est rcupr par l'application.
WM_KEYUP : c'est le dernier message qu'envoie Windows. Il est envoy lorsque la touche est relche.
Nous avons donc trois messages notre disposition pour simuler des actions au clavier. En gnral, l'utilisation de
WM_KEYDOWN est suffisante, mais il arrive avec certaines applications (WinAMP 3, Lecteur Windows Media, ...)
que ce ne soit pas suffisant. En effet, certaines applications prennent en compte l'envoi du premier message puis
ignorent les suivants ; pour viter cela on peut, quand cela est ncessaire, simuler galement le relchement de la
touche avec WM_KEYUP. Il est dconseill de le faire dans tous les cas car il arrive rgulirement que cela ait pour
effet de ddoubler l'action et le rsultat ne sera donc pas celui attendu.
III-C-2 - La souris :
WM_LBUTTONDOWN : ce message correspond l'enfoncement du bouton gauche de la souris.
WM_LBUTTONUP : ce message intervient lors du relchement du bouton gauche de la souris.
WM_LBUTTONDBLCLK : ce message simule un double clique du bouton gauche. Il est prcd des messages
WM_LBUTTONDOWN, WM_LBUTTONUP et suivi de WM_LBUTTONUP.
WM_MOUSEWHEEL : ce message simule une rotation de la molette et indique l'amplitude de la rotation.
Chacun des trois premiers messages a son quivalement pour les bouton du milieu (mollette) et de droite en
remplaant respectivement L par M ou R. L'intert de ces trois messages est assez limit car pour simuler le clique
sur un bouton, il faut connatre son identificateur (unique et propre l'application laquelle il appartient) et c'est un
message du type WM_COMMAND qu'il faut gnrer. Par contre, WM_MOUSEWHELL peut s'avrer utile car il est
frquent que la molette de la souris permette de contrler le volume ou de faire dfiler des images.
III-D-1 - Le clavier :
Les messages utiliss pour manipuler le clavier utilisent tous les mme paramtres : le code de la touche d'une part
et des informations de rptition et / ou d'tat des touches systmes qui ne sont gnralement pas utilises par les
applications d'autre part. Nous n'allons dtailler que le premier puisque le second ne nous avancera pas dans la
rsolution de notre problme et que toutes les informations sont disponnibles dans le SDK Microsoft (Win32 SDK).
Le premier paramtre est donc le code "virtuel" de la touche presse. Les codes sont des valeurs prdfinies dans
les enttes windows et commencent par VK. Voici un tableau rcapitulatif :
-6Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
Value (hexadecimal)
Mouse or keyboard
equivalent
VK_LBUTTON
01
Left mouse button
VK_RBUTTON
02
Right mouse button
VK_CANCEL
03
Control-break processing
VK_MBUTTON
04
Middle mouse button (threebutton mouse)
05-07
Undefined
VK_BACK
08
BACKSPACE key
VK_TAB
09
TAB key
0A-0B
Undefined
VK_CLEAR
0C
CLEAR key
VK_RETURN
0D
ENTER key
0E-0F
Undefined
VK_SHIFT
10
SHIFT key
VK_CONTROL
11
CTRL key
VK_MENU
12
ALT key
VK_PAUSE
13
PAUSE key
VK_CAPITAL
14
CAPS LOCK key
15-19
Reserved for Kanji systems
1A
Undefined
VK_ESCAPE
1B
ESC key
1C-1F
Reserved for Kanji systems
VK_SPACE
20
SPACEBAR
VK_PRIOR
21
PAGE UP key
VK_NEXT
22
PAGE DOWN key
VK_END
23
END key
VK_HOME
24
HOME key
VK_LEFT
25
LEFT ARROW key
VK_UP
26
UP ARROW key
VK_RIGHT
27
RIGHT ARROW key
VK_DOWN
28
DOWN ARROW key
VK_SELECT
29
SELECT key
2A
Original equipment
manufacturer (OEM) specific
VK_EXECUTE
2B
EXECUTE key
VK_SNAPSHOT
2C
PRINT SCREEN key for
Windows 3.0 and later
VK_INSERT
2D
INS key
VK_DELETE
2E
DEL key
VK_HELP
2F
HELP key
VK_0
30
0 key
VK_1
31
1 key
VK_2
32
2 key
VK_3
33
3 key
VK_4
34
4 key
VK_5
35
5 key
VK_6
36
6 key
VK_7
37
7 key
VK_8
38
8 key
VK_9
39
9 key
3A-40
Undefined
-7VK_A
41 les utiliser votre convenance. Par contre, la page
A key
Les sources prsentes
sur cette page sont libres de droits et vous pouvez
de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
VK_B
42
B
key
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
VK_C
43http://tcharles.developpez.com/simul/ C key
Nous savons maintenant simuler des actions du clavier, mais il n'est cependant toujours pas possible de simuler la
pression d'un raccourcis clavier plus complexe qu'une touche tel que ALT + ENTREE.
III-D-2 - La souris :
Comme je l'ai dit dans la partie prcdente, l'intert des vnements WM_LBUTTONDOWN, WM_LBUTTONUP et
WM_LBUTTONDBLCLK est minime dans notre dmarche, nous n'allons donc tudier que l'utilisation du message
WM_MOUSEWHEEL.
Le message WM_MOUSEWHEEL fournit quatre informations de 16 bits chacunes rparties entre les mots hauts et
bas des deux arguments (32 bits chacuns) de PostMessage() restants notre disposition. Voyons quelles sont les
informations fournir :
Tout d'abord, il y a les tats des touches systmes et des trois boutons de la souris. Ceux-ci sont reprsents
l'aide de masques prdfinis dans le SDK Microsoft par les constantes : MK_CONTROL (Contrle), MK_SHIFT
(Majuscule), MK_LBUTTON, MK_MBUTTON et MK_RBUTTON (boutons gauche, milieu et droit de la souris). Il n'y
a aucune garantie que l'application cible s'en serve
Ensuite, il y a la valeur de la rotation de la molette. Une valeur positive reprsente une
rotation vers le haut (vers le fil de la souris) et une valeur ngative reprsente une rotation
vers le bas (vers l'utilisateur). La rotation quivalent un "cran" de la molette est dfinie
par la constante WHEEL_DELTA (120). Il est possible d'utiliser des valeurs plus prcises,
mais toutes les applications n'en tiennent pas compte.
Finalement, il y a la positon verticale et horizontale du curseur au moment de l'vnement. L encore, il n'y a aucune
garantie que l'application cible s'en serve.
Voyons maintenant comment construire les arguments de PostMessage() partir de ces informations. La position du
curseur doit tre place dans le second paramtre et les autres informations dans le premier. L'exemple ci-dessous
montre comment le faire en C :
int iPosX,iPosY;
int iMasqueTouches;
int iDeplMolette;
DWORD dwWParam,dwLParam;
HWND hWindow;
// initialisation des variables avec les valeurs souhaites
dwLParam = iPosY << 16 | iPosX; // on effectue un dcallage de 16 bits vers la gauche
dwWParam = iDeplMolette << 16 | iMasqueTouches;
-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
Voil, nous avons maintenant tous les lments dont nous avions besoin pour simuler des actions simples l'attention
d'une application dtermine. Cependant, cela n'est pas suffisant car on ne peut toujours pas faire de simulation
globale, ni dplacer la souris : il n'est donc pas possible d'interfacer un priphrique multimdia tel qu'un joystick
avec la sourris et le clavier. C'est pourquoi nous allons voir dans une deuxime partie comment simuler le clavier et
la souris un niveau beaucoup plus proche de la machine.
-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
intercepter les significations d'tat que pourraient tre amens faire d'autres pilotes de priphriques si le systme
avait voulu qu'on l'informe toutes les n millisecondes de l'tat de chacune des touches. Voyons maintenant quels
sont les paramtres que la fonction keybd_event() attend.
La fonction keybd() prend quatre paramtres : le code touche virtuel (ENTREE, A, F1, ...), le code matriel de
la touche (touche n 1, n2, ...), un masque indiquant si la touche est une touche tendue et si la touche est
relche et finalement un double-mot contenant des information supplmentaires. Les codes de touches virtuels
ont t prsents dans la partie prcdente. Les codes matriels de touche ne sont pas utiles pour nous car
ils correspondent une tape antrieure des pilotes de priphrique ; nous le laisserons donc 0. Le masque
est compos partir de KEYEVENTF_EXTENDEDKEY qui indique que la touche est soit AltGr soit Ctrl droite,
et KEYEVENTF_KEYUP qui indique que la touche est relche. Finalement le dernier paramtre est une donne
complmentaire qui ne nous sert rien non plus, on le laissera donc 0. Voici un exemple dans lequel on considre
que par exemple le lecteur Windows Media est en train de lire une video. Notre programme exemple va simuler la
pression de Alt + Entree pour faire passer le lecteur en mode plein cran.
#include <windows.h>
int main(int argc, char *argv[])
{
SetForegroundWindow(FindWindow("Media Player 2",NULL));
Sleep(100);
keybd_event(VK_LMENU,0,0,0);
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
return 0;
}
http://tcharles.developpez.com/simul/
GetCursorPos(&pt);
if (GetKeyState(VK_UP) & Mask)
pt.y -= 1;
if (GetKeyState(VK_DOWN) & Mask)
pt.y += 1;
if (GetKeyState(VK_LEFT) & Mask)
pt.x -= 1;
if (GetKeyState(VK_RIGHT) & Mask)
pt.x += 1;
SetCursorPos(pt.x,pt.y);
Sleep(10);
}
return 0;
MOUSEEVENTF_MOVE
MOUSEEVENTF_LEFTDOWN
MOUSEEVENTF_LEFTUP
MOUSEEVENTF_RIGHTDOWN
MOUSEEVENTF_RIGHTUP
MOUSEEVENTF_MIDDLEDOWN
MOUSEEVENTF_MIDDLEUP
MOUSEEVENTF_WHEEL
Voyons maintenant un exemple. Nous allons complter l'exemple prcdent en ajoutant les fonctionnalits suivantes :
les touches 1, 2 et 3 du pav numrique seront les trois boutons de la souris, le - du pav numrique sera la mollette
vers le haut et le + la mollette vers le bas.
#include <windows.h>
int main(int argc, char *argv[])
{
POINT pt;
BOOL bContinue = TRUE;
SHORT Mask = 32768;
DWORD dwEventFlags;
DWORD dwData;
while (bContinue)
{
dwData = 0;
dwEventFlags = MOUSEEVENTF_ABSOLUTE;
if (GetKeyState(VK_ESCAPE) & Mask)
bContinue = FALSE;
- 11 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
GetCursorPos(&pt);
if (GetKeyState(VK_NUMPAD1) & Mask)
{
if (!(GetKeyState(VK_LBUTTON) & Mask))
dwEventFlags |= MOUSEEVENTF_LEFTDOWN;
}
else if (GetKeyState(VK_LBUTTON) & Mask)
// Ce test est ncessaire pour s'assurer qu'on n'envoie pas plus
// de relevs de touche que d'abaissements
dwEventFlags |= MOUSEEVENTF_LEFTUP;
if (GetKeyState(VK_NUMPAD2) & Mask)
{
if (!(GetKeyState(VK_MBUTTON) & Mask))
dwEventFlags |= MOUSEEVENTF_MIDDLEDOWN;
}
else if (GetKeyState(VK_MBUTTON) & Mask)
dwEventFlags |= MOUSEEVENTF_MIDDLEUP;
if (GetKeyState(VK_NUMPAD3) & Mask)
{
if (!(GetKeyState(VK_RBUTTON) & Mask))
dwEventFlags |= MOUSEEVENTF_RIGHTDOWN;
}
else if GetKeyState(VK_R3BUTTON) & Mask)
dwEventFlags |= MOUSEEVENTF_RIGHTUP;
if (GetKeyState(VK_SUBTRACT) & Mask)
{
dwEventFlags |= MOUSEEVENTF_WHEEL;
dwData += WHEEL_DELTA;
}
else if (GetKeyState(VK_ADD) & Mask)
{
dwEventFlags |= MOUSEEVENTF_WHEEL;
dwData -= WHEEL_DELTA;
}
if (GetKeyState(VK_UP) & Mask)
pt.y -= 1;
if (GetKeyState(VK_DOWN) & Mask)
pt.y += 1;
if (GetKeyState(VK_LEFT) & Mask)
pt.x -= 1;
if (GetKeyState(VK_RIGHT) & Mask)
pt.x += 1;
SetCursorPos(pt.x,pt.y);
mouse_event(dwEventFlags,pt.x,pt.y,dwData,0);
Sleep(10);
}
return 0;
Maintenant que nous avons vu touts les moyebs mis notre disposition pour rsoudre les problmes que nous pose
le contrle d'applications tierces, il ne nous reste plus qu' rsoudre certains problmes qui peuvent apparatre dans
leur mise en oeuvre.
http://tcharles.developpez.com/simul/
Voyons un bref exemple de simulation pseudo-cible d'un raccourci clavier. Nous allons faire passer l'affichage de
la video du lecteur Windows Media en plein cran (ou inverse)
#include <windows.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
HWND hMediaplayer = FindWindow("Media Player 2",NULL);
if (hMediaplayer)
{
keybd_event(VK_LMENU,0,0,0);
SendMessage(hMediaPlayer,WM_CHAR,VK_RETURN,0);
keybd_event(VK_LMENU,0,KEYEVENTF_KEYUP,0);
}
return 0;
}
printf("Vous avez 5 secondes pour activer la fentre dont vous voulez connatre le class name\r
printf("Appuyez sur une touche pour dclancher le compteur ...");
getch();
Sleep(5000);
hFore = GetForegroundWindow();
iNbChar = GetClassName(hFore,szBuffer,128);
if (iNbChar && (iNbChar < 128))
{
printf("\r\nLe class name de cette fentre est :\r\n|%s|",szBuffer);
printf("\r\nLes barres verticales (|) de gauche et droite n'en font pas partie\r\n");
}
else
{
printf("Impossible de rcuprer le class name ou celui-ci est trop long\r\n");
}
return 0;
- 13 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
WH_DEBUG
WH_FOREGROUNDIDLE
WH_GETMESSAGE
WH_JOURNALPLAYBACK
WH_JOURNALRECORD
WH_KEYBOARD
WH_MOUSE
WH_MSGFILTER
WH_SYSMSGFILTER
WH_SHELL
Action hooke
voir les messages envoys par
SendMessage avant l'application
destinataire.
idem mais aprs traitement.
contrler et autoriser les
actions essentielles (activation,
cration, destruction, rduction,
agrandissement, dplacement,
redimensionnement d'une fentre,
avant de terminer une commande
systme, avant de retirer un
vnement de la souris ou du
clavier de la file de message, avant
d'appliquer le focus, avant de
synchroniser l'application avec la file
de messages)
autoriser ou non l'appel des
fonctions associes aux autres
hooks car il est appel avant
n'importe quel autre type de hook.
effectuer des applications de basse
priorit quand le thread principal de
l'application est inactif.
contrler tout type de message
envoy une application.
insrer des messages enregistrs
avec WH_JOURNALRECORD dans
la file systme.
enregistrer une squence
d'vnement pour les rejouer plus
tard.
intercepter les messages de type
WM_KEYDOWN et WM_KEYUP.
intercepter les messages de la
souris.
intercepter les messages destins
aux menus, ascenseurs, boites
de dialogue et de dtecter si une
fentre va tre active par ALT+TAB
ou ALT+ESC de l'application.
idem mais pour toutes les
applications
recevoir les notifications importantes
(une fentre au premier plan est sur
le point d'tre cre ou dtruite)
Porte
Thread ou Systme
Thread ou Systme
Thread ou Systme
Thread ou Systme
Thread ou Systme
Thread ou Systme
Systme
Systme
Thread ou Systme
Thread ou Systme
Thread ou Systme
Systme
Thread ou Systme
- 14 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
Ce tutoriel tant destin la gestion du clavier et de la souris, nous ne verrons que les hooks WH_MOUSE et
WH_KEYBOARD, mais les autres hooks s'utilisent exactement de la mme faon.
Pour chaque type de hook, ces trois paramtres ont une signification particulire : nCode est un indicateur pour l'action
a effectuer et wParam et lParam contiennent les informations du message qui a t envoy. La valeur renvoye
par cette fonction doit tre celle renvoye par la fonction de propagation du message, CallNextHookEx(). Cette
fonction prends en paramtres le handle du hook qu'on vient de grer, suivi des arguments reus par HookProc(),
ventuellement modifis. Si le message est intercept par le hook (pas d'appel CallNextHookEx()), la valeur
renvoye par HookProc() devrait tre nulle (0L en C).
Dtaillons maintenant le contenu des paramtres pour les fonctions associes WH_KEYBOARD et WH_MOUSE.
- WH_KEYBOARD :
Le paramtre nCode prends sa valeur parmis HC_ACTION et HC_NOREMOVE. Dans le cas (rare) de la seconde
valeur, cela veut dire qu'une application a lu le message sans le retirer de la file par un appel PeekMessage()
spcifiant le drapeau PM_NOREMOVE. Dans tous les cas, wParam et lParam contiennent les informations a propos
de l'vnement clavier. Il peut arriver que ce paramtre ait une valeur ngative, la fonction doit alors immdiatement
se terminer dans un appel CallNextHookEx().
Les paramtres wParam et lParam contiennent les mmes informations que dans le cas de WM_KEYDOWN ou
WM_KEYUP : le code virtuel de la touche actionne et les informations de rptition, d'tat ...
- WH_MOUSE :
Le paramtre nCode prends sa valeur parmis HC_ACTION et HC_NOREMOVE. Dans le cas (rare) de la seconde
valeur, cela veut dire qu'une application a lu le message sans le retirer de la file par un appel PeekMessage()
spcifiant le drapeau PM_NOREMOVE. Dans tous les cas, wParam et lParam contiennent les informations a propos
- 15 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
de l'vnement souris. Il peut arriver que ce paramtre ait une valeur ngative, la fonction doit alors immdiatement
se terminer dans un appel CallNextHookEx().
Le paramtre wParam contient le type du message (WM_LBUTTONDOWN WM_MOUSEWHEEL)
Le paramtre lParam contient un pointeur sur une structure MOUSEHOOKSTRUCT qui, elle, contient une structure
POINT indiquant la position de la souris ; le handle de la fentre qui va recevoir le message ; le type de cible qui se
trouve sous la souris et finalement des informations complmentaires pour le message. Voici un tableau exhaustif
des types de cibles.
Valeur
HTBORDER
HTBOTTOM
HTBOTTOMLEFT
HTBOTTOMRIGHT
HTCAPTION
HTCLIENT
HTERROR
HTGROWBOX
HTHSCROLL
HTLEFT
HTMENU
HTNOWHERE
HTREDUCE
HTRIGHT
HTSIZE
HTSYSMENU
HTTOP
HTTOPLEFT
HTTOPRIGHT
HTTRANSPARENT
HTVSCROLL
HTZOOM
Position du curseur
Sur le bord d'une fentre qui ne peut pas
tre redimensionne
Sur le bord horizontal infrieur d'une fentre
Sur le coin infrieur gauche d'une fentre
Sur le coin infrieur droit d'une fentre
Sur une barre de titre
Sur une zone cliente
Sur le fond d'cran ou sur une ligne de
sparation entre deux fentres (pareil que
HTNOWHERE, l'exception que la fonction
DefWindowProc() produit un beep systme
pour indiquer une erreur)
Sur une boite de redimensionnement (pareil
que HTSIZE)
Sur un ascenceur horizontal
Sur le bord gauche d'une fentre
Sur un menu
Sur le fond d'cran ou sur une ligne de
sparation entre deux fentres
Sur un bouton de minimisation
Sur le bord droit d'une fentre
Sur une boite de redimensionnement (pareil
que HTGROWBOX)
Sur un menu system ou sur un bouton
Fermer d'une fentre enfant.
Sur le bord horizontal suprieur d'une
fentre
Sur le coin suprieur gauche d'une fentre
Sur le coin suprieur droit d'une fentre
Sur une fentre recouverte par une autre
Sur un ascenceur vertical
Sur un bouton de maximisation
Voyons maintenant un exemple de DLL permettant le hook du clavier et de la souris. Celle-ci sera compos de cinq
fonctions : la fonction d'inistialisation (fermeture) de la DLL qui attachera (dtachera) la zone de mmoire partage,
la fonction d'initialisation des hooks, la fonction de destruction des hooks et les deux fonctions de crochetage (clavier
et souris).
Voici le code de la DLL. Le fichier compil sera nomm "hooksClSo.dll".
#include <windows.h>
// Dfinition de la structure de la zone mmoire partage
typedef struct _TDonnees
{
- 16 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
}
return 1;
http://tcharles.developpez.com/simul/
}
void _export EndHook()
{
// Supression des hooks
UnhookWindowsHookEx(VueDonnees->MouseHookHandle);
UnhookWindowsHookEx(VueDonnees->KeybdHookHandle);
}
LRESULT CALLBACK _export MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
// On joue un son chaque fois que l'utilisateur enfonce le bouton gauche
if (wParam == WM_LBUTTONDOWN)
MessageBeep(MB_OK);
return CallNextHookEx(VueDonnees->MouseHookHandle,nCode,wParam,lParam);
}
#define WMAP_KEYBDHOOKMSG WM_APP + 1
LRESULT CALLBACK _export KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
{
// On envoie un message WMAP_KEYBDHOOKMSG chaque fois que
// l'utilisateur presse la touche ENTREE
if (wParam == VK_RETURN)
PostMessage(VueDonnees->hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);
}
return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
Voyons maintenant l'application. Tout d'abord crons une fiche qui contient une case
cocher et un label comme le montre l'image ci-contre. Ensuite, il va faloir dfinir un
gestionnaire de message pour WMAP_KEYBDHOOKMSG ainsi que quelques variables
ncessaires l'application. Ci-aprs, l'entte de la fiche.
#ifndef appliH
#define appliH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
typedef void (*TInitFunc)(HWND);
typedef void (*TEndFunc)();
#define WMAP_KEYBDHOOKMSG WM_APP + 1
class TForm1 : public TForm
{
__published: // Composants grs par l'EDI
TCheckBox *CheckBox1;
TLabel *Label1;
void
__fastcall CheckBox1Click(TObject *Sender);
void
__fastcall FormClose(TObject *Sender, TCloseAction &Action);
private: // Dclarations utilisateur
TInitFunc InitHooks; // fonction d'initialisation des hooks
TEndFunc EndHooks; // fonction de suppression des hooks
HINSTANCE hinstDLL; // instance de la DLL
bool bHook; // Les hooks ont-ils t initialiss ?
int nbEntree; // compteur de pressions pour le gestionnaire de messages
public: // Dclarations utilisateur
void __fastcall PressionEntree(TWMNoParams &p);
__fastcall TForm1(TComponent* Owner);
protected: // dclaration du gestionaire de messages
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WMAP_KEYBDHOOKMSG, TWMNoParams, PressionEntree)
END_MESSAGE_MAP(TForm)
};
extern PACKAGE TForm1 *Form1;
- 18 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
#endif
Une fois compil, cet exemple permettra de compter les pressions et relchements de la touche ENTREE, et jouera
le son "par dfaut" de Windows chaque click de souris.
- 19 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/
VI - Les hooks
(non non, ici on ne parle pas du capitaine crochet ;-))
L'objectif d'une application qui contrle le clavier ou la souris, n'est pas toujours de simuler un comportement,
mais peut galement tre de ragir un comportement de l'utilisateur. Par ailleurs, il peut tre utile d'tudier le
comportement d'une application pour mieux la contrler par la suite. Nous allons voir comment faire cela au travers
des hooks. Nous verrons tout d'abord ce qu'est un hook, les diffrents types de hooks que propose Windows,
les prrequis pour la mise en place d'un hook, puis comment les mettre en place.
- 20 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 gRRosminet. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans
l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.
http://tcharles.developpez.com/simul/