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 IntegerDans 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 = 3V-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 = &H20EUn 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 ClassCes 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 ClassSes 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).


