Hook sans dll bloquant le double click

Soyez le premier à donner votre avis sur cette source.

Vue 4 689 fois - Téléchargée 219 fois

Description

Cette source permet d'intercepter, via les hooks, le double click d'une souris, et de ne pas renvoyer ce message aux différentes application de Windows.

Merci à racpp de m'avoir expliqué qu'il est impossible d'intercepter le WM (Windows Message) WM_LBUTTONDBLCLK.

Il faut donc dans l'ordre :
1°) tester le simple click (WM_LBUTTONDOWN).
2°) Vérifier l'intervalle de temps entre le premier et le deuxième click et le comparer à l'intervalle défini dans le système.
3°) Vérifier qu'entre les deux clicks, le pointeur n'ai pas bougé plus que la limite fixée par le système.
4°) Si toutes ces conditions sont remplies, alors le HOOKPROC doit retourner 1.

Source / Exemple :


#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

HHOOK hHook;    // Handle du hook global
HINSTANCE hExe; // Handle de notre exécutable

// Fonction de gestion du hook 
__declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam) 
{
    static POINT position;	// Position de la souris 
    static DWORD temps;		// Temps du double click
    
    if ((nCode == HC_ACTION) && (wParam == WM_LBUTTONDOWN))
    {
        MSLLHOOKSTRUCT* souris = ((MSLLHOOKSTRUCT*)lParam);		// MouseHookStruct
        
        // L'intervalle de temps entre les 2 clicks doit être inférieur à l'intervalle défini par le système
        if( (souris->time - temps) <= GetDoubleClickTime() )
        {
            int limiteX = GetSystemMetrics(SM_CXDOUBLECLK) / 2;	
            int limiteY = GetSystemMetrics(SM_CYDOUBLECLK) / 2;

            //Le déplacement du curseur entre les 2 clicks ne doit pas dépasser limiteX/Y
            if(	souris->pt.x >= (position.x-limiteX) && 
				souris->pt.x <= (position.x+limiteX) &&
                position.y >= (souris->pt.y-limiteY) &&
                position.y <= (souris->pt.y+limiteY))
					return 1;
        }

        temps=souris->time;
        position=souris->pt;
    }
    
    return CallNextHookEx(hHook, nCode, wParam, lParam);   // Si ce n'est pas un double click, on laisse passer le message
}

int main ()
{      
    // Permet de lancer vlc en spécifiant le chemin, et le comportement (normal, minimisé, agrandi)
    // WinExec("C:\\Documents and Settings\\Administrateur\\Bureau\\vlc-1.0.0-mouse-disables\\vlc.exe", SW_NORMAL);
    
    // Il est également possible de lancer un programme en passant des paramètres à ce programme via ShellExecute()
    
    hExe = GetModuleHandle(0);
    hHook = SetWindowsHookEx( WH_MOUSE_LL, (HOOKPROC) HookProc, hExe, 0);
    MSG message;     
          
    printf ("Le double click est desormais desactiver.\nPour le reactiver, veuillez fermer cette fenetre.");      
          
    while (GetMessage(&message,NULL,0,0))
    {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
    UnhookWindowsHookEx(hHook);

    return 0;
}

Conclusion :


Une fois l'appli lancé, le double click est totalement désactivé dans Windows.
Pour le réactiver, il faut fermer l'appli.

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Une petite remarque.
A ta place je sortirais de la HookProc les appels aux API pour éviter la redondance. De ce fait j'aurai déclarer limiteX, limiteY et souris en variable globale, et je les aurais initialisé dans le main.

Sinon prend l'habitude de nommer tes variables en anglais. Tu pourras trouver les conventions de nommage sur le site de microsoft.

Shell

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.