VI. Hook souris▲
V-A. Présentation▲
Nous allons utiliser les API présentées précédemment pour créer un Hook local
et un Hook global sur les messages d'activité de la souris.
Pour ce faire, nous utiliserons les types de Hook suivants :
- WH_MOUSE
- WH_MOUSE_LL
V-B. Types de Hook souris▲
V-B-1. WH_MOUSE▲
Ce type de Hook réagit aux messages fournis aux applications suite à un GetMessage (attente d'un message positionné par un application) ou un PeekMessage (vérification de la disponibilité d'un message et récupération) sur les messages d'activité de la souris.
Il peut être soit Local, soit Global.
V-B-1. WH_MOUSE_LL▲
Ce type de Hook réagit aux messages fournis par le driver de la souris
et générés via l'API SendInput.
Il s'agit d'un Hook de "bas niveau" (d'où le LL pour Low Level).
De part sa nature, un Hook de "bas niveau" est toujours Global.
V-C. Procédure de traitement▲
Comme pour tout Hook, la procédure de traitement d'un Hook souris se présente ainsi :
Public
Delegate
Function
HookProc _
(
ByVal
nCode As
Integer
, _
ByVal
wParam As
Integer
, _
ByVal
lParam As
IntPtr) As
Integer
Dans le cadre d'un Hook souris, les paramètres passés à la procédure sont les suivants :
V-C-1. nCode▲
Code destiné à déterminer quel est le traitement à effectuer.
Pour un Hook souris de type WH_MOUSE_LL, il sera toujours
positionné à HC_ACTION signifiant que des informations sur
un message d'activité de la souris sont disponibles.
Pour un Hook de type WH_MOUSE, il pourra également prendre
la valeur HC_NOREMOVE signifiant que des informations sur
un message d'activité de la souris sont disponibles et que
ce message n'a pas été supprimé de la file des messages
suite à un PeekMessage avec flag PM_NOREMOVE.
Protected
Const
HC_ACTION As
Integer
=
0
Protected
Const
HC_NOREMOVE As
Integer
=
3
V-C-2. wParam▲
Il s'agit du type de message d'activité de la souris :
' Type de messages souris
' -- Déplacement
Protected
Const
WM_MOUSEMOVE As
Integer
=
&H200
' -- Bouton gauche
' ---- Zone cliente
Protected
Const
WM_LBUTTONDOWN As
Integer
=
&H201
Protected
Const
WM_LBUTTONUP As
Integer
=
&H202
Protected
Const
WM_LBUTTONDBLCLK As
Integer
=
&H203
' ---- Zone non cliente
Protected
Const
WM_NCLBUTTONDBLCLK As
Integer
=
&HA3
Protected
Const
WM_NCLBUTTONDOWN As
Integer
=
&HA1
Protected
Const
WM_NCLBUTTONUP As
Integer
=
&HA2
' -- Bouton droit
' ---- Zone cliente
Protected
Const
WM_RBUTTONDOWN As
Integer
=
&H204
Protected
Const
WM_RBUTTONUP As
Integer
=
&H205
Protected
Const
WM_RBUTTONDBLCLK As
Integer
=
&H206
' ---- Zone non cliente
Protected
Const
WM_NCRBUTTONDBLCLK As
Integer
=
&HA6
Protected
Const
WM_NCRBUTTONDOWN As
Integer
=
&HA4
Protected
Const
WM_NCRBUTTONUP As
Integer
=
&HA5
' -- Bouton central
' ---- Zone cliente
Protected
Const
WM_MBUTTONDOWN As
Integer
=
&H207
Protected
Const
WM_MBUTTONUP As
Integer
=
&H208
Protected
Const
WM_MBUTTONDBLCLK As
Integer
=
&H209
' ---- Zone non cliente
Protected
Const
WM_NCMBUTTONDBLCLK As
Integer
=
&HA9
Protected
Const
WM_NCMBUTTONDOWN As
Integer
=
&HA7
Protected
Const
WM_NCMBUTTONUP As
Integer
=
&HA8
' -- X Bouton
' ---- Zone cliente
Protected
Const
WM_XBUTTONDOWN As
Integer
=
&H20B
Protected
Const
WM_XBUTTONUP As
Integer
=
&H20C
Protected
Const
WM_XBUTTONDBLCLK As
Integer
=
&H20D
' ---- Zone non cliente
Protected
Const
WM_NCXBUTTONDOWN As
Integer
=
&HAB
Protected
Const
WM_NCXBUTTONUP As
Integer
=
&HAC
Protected
Const
WM_NCXBUTTONDBLCLK As
Integer
=
&HAD
' Molette
Protected
Const
WM_MOUSEWHEEL As
Integer
=
&H20A
Protected
Const
WM_MOUSEHWHEEL As
Integer
=
&H20E
Un hook de type WH_MOUSE_LL ne reçoit pas de messages de type "double click" (WM_xxBUTTONDBLCLK) ou "click en zone non cliente" (WM_NCxBUTTONxxxx).
V-C-3. lParam▲
V-C-3-a. Hook de type WH_MOUSE_LL▲
Dans ce cas, lParam contient un pointeur vers une structure MOUSEHOOKSTRUCT :
<
StructLayout
(
LayoutKind.Sequential
)>
_
Private
Class
MSLLHOOKSTRUCT
Public
pt As
PointMHS
Public
mouseData As
Integer
Public
flags As
Integer
Public
time
As
Integer
Public
dwExtraInfo As
Integer
End
Class
Ces paramètres sont :
- pt :
Structure contenant les coordonnées X/Y de la position de la souris :
<
StructLayout
(
LayoutKind.Sequential
)>
_
Protected
Class
PointMHS
Public
x As
Integer
Public
y As
Integer
End
Class
- mouseData :
Dans le cas d'un message WM_MOUSEWHEEL, Delta de
positionnement (sur les 8 premiers bits).
- flags :
1 si l'événement est issu d'un SendInput (événement généré applicativement)
, 0 sinon.
- time :
Timestamp du message : durée entre le démarrage du système et la production
du message en millisecondes.
- dwExtraInfo :
Information supplémentaire (non utilisée).
V-C-3-b. Hook de type WH_MOUSE▲
Dans ce cas, lParam contient un pointeur vers une structure MOUSEHOOKSTRUCTEX :
<
StructLayout
(
LayoutKind.Sequential
)>
_
Private
Class
MOUSEHOOKSTRUCT
Public
pt As
PointMHS
Public
hwnd As
Integer
Public
wHitTestCode As
Integer
Public
dwExtraInfo As
Integer
Public
mouseData As
Integer
End
Class
Ses paramètres sont :
- pt :
Structure contenant les coordonnées X/Y de la position de la souris :
<
StructLayout
(
LayoutKind.Sequential
)>
_
Protected
Class
PointMHS
Public
x As
Integer
Public
y As
Integer
End
Class
- hwnd :
Handle de la fenêtre destinatrice du message.
- wHitTestCode :
Code identifiant la zone de la fenêtre concernée par le message :
HTERROR =
(
-2
)
HTTRANSPARENT =
(
-1
)
HTNOWHERE =
0
HTCLIENT =
1
HTCAPTION =
2
HTSYSMENU =
3
HTGROWBOX =
4
HTSIZE =
HTGROWBOX
HTMENU =
5
HTHSCROLL =
6
HTVSCROLL =
7
HTMINBUTTON =
8
HTMAXBUTTON =
9
HTLEFT =
10
HTRIGHT =
11
HTTOP =
12
HTTOPLEFT =
13
HTTOPRIGHT =
14
HTBOTTOM =
15
HTBOTTOMLEFT =
16
HTBOTTOMRIGHT =
17
HTBORDER =
18
HTREDUCE =
HTMINBUTTON
HTZOOM =
HTMAXBUTTON
HTSIZEFIRST =
HTLEFT
HTSIZELAST =
HTBOTTOMRIGHT
HTOBJECT =
19
HTCLOSE =
20
HTHELP =
21
- dwExtraInfo :
Information supplémentaire (non utilisée).
- mouseData :
Dans le cas d'un message WM_MOUSEWHEEL, Delta de
positionnement (sur les 8 premiers bits).