IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Principe du Hook et utilisation d'un Hook souris

Principe du Hook et utilisation d'un Hook souris


précédentsommairesuivant

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 :

Hook Procedure
Sélectionnez
	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.

nCode
Sélectionnez
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 :

Hook Procedure
Sélectionnez
	' 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 :

MSLLHOOKSTRUCT
Sélectionnez
    <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 :

Point (API)
Sélectionnez
    <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 :

MOUSEHOOKSTRUCTEX
Sélectionnez
    <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 :

Point (API)
Sélectionnez
    <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 :

Hit Test Code
Sélectionnez
	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).


précédentsommairesuivant

Copyright © 2008 Anthony DE DECKER. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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 intérêts. Droits de diffusion permanents accordés à Developpez LLC.