begin process at 2010 02 10 06:33:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > HOOK SANS DLL BLOQUANT LE DOUBLE CLICK

HOOK SANS DLL BLOQUANT LE DOUBLE CLICK


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :HOOK, DOUBLE CLICK, SANS DLL Niveau :Débutant Date de création :24/09/2008 Date de mise à jour :24/09/2008 19:33:24 Vu / téléchargé :2 045 / 78

Auteur : Leucistic

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 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

  • #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;
  • }
#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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   MouseBlocker
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 266 octets
    • main.oTélécharger ce fichier [Réservé aux membres club]1 948 octets
    • Makefile.winTélécharger ce fichier [Réservé aux membres club]803 octets
    • MouseBlocker.devTélécharger ce fichier [Réservé aux membres club]840 octets

Télécharger le zip


 Historique

24 septembre 2008 19:33:24 :
J'avais oublier dans la description de citer racpp qui m'a aidé.

 Sources de la même categorie

Source avec Zip Source avec une capture CALENDRIER (WIN64) par BruNews
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS par racpp
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI... par racpp
Source avec Zip Source avec une capture BROUILLAGE DES FICHIERS JAVASCRIPT ET CSS(WIN32) par gagah1
Source avec Zip Source avec une capture CHANGE CURSEUR par ganjarasta

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MOUSECONTROL par NeoUmbrella
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] IMPSCREEN IMPRIME ECRAN PAR HOOK SANS DL... par omnia
Source avec Zip BEEPER, UTILISER UN HOOK CLAVIER INTÉGRÉ À L'EXÉCUTABLE ET G... par ndubien
Source avec Zip Source avec une capture KEYLOGGER SERVEUR/CLIENT par yann2192
Source avec Zip HOOK SOURIS SUR TASKBAR (WIN32) par BruNews

Commentaires et avis

Commentaire de DeAtHCrAsH le 24/09/2008 16:13:03

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

hook sur la touche entrée [ par Anacr0x ] voila mon problème, jme suis aidé avec la source de BruNews pour faire ce code mais ca ne marche pas !// le HOOK LOCAL est ICILRESULT CALLBACK GetMsgP hook global [ par Xentor609 ] Salut,Je sais bien que ca enerve certain les questions sur les hooks, mais al trouve vraiment pas.Je souhaiterais placer un hook sur le clavier, pour kesk1 hook? [ par melkiorlenecrarque ] alu!ben C tout simple!kesk1 hook et a koi sa sert?merci Hook sur fenêtre "Enregistrer sous" [ par annplop ] Bonjour,je souhaite intercepter une fenêtre "enregistrer sous", et remplir les différents champs:"Enregistrer dans""Nom de l'objet""type"Est-ce quelqu Hook [ par Anacr0x ] Salut tt le monde,j'ai juste une petite question :lorsqu'on crée un hook, on intercepte les message, mais ya-t-il un moyen de les bloqué totalement ?J Hook sur WSAsend ? [ par 83ron ] Lut tous le monde touts d'abord ^^.Voila, j'aimerais fair un prog qui intercepete les message d'une application transmis via les Sockets. Donc je voul HOOK - Help [DevCPP] [ par guitoulefoux ] Bonjour,J'essaye de faire un hook (mon 1er) mais a chaque fois qu'il se lance j'ai un pb d'affectation mémoire.en fait le HOOK récupère les actions cl Hook intercepté ?? [ par mlarrere ] Je souhaite utiliser un hook keyboard pour intercepter des touches et les renvoyers différemment.C'est un hook global (DLL) car c'est pour une appli e Hook probleme ie [ par oBsEC ] Bien voila, j explike mon probleme:je fais une application ki interdit a l utilisateur certaine fonction d internet explorer, comme l acces o menu ou hook pour garder sa fenetre au dessus des autres meme face a des jeux [ par testtestiop ] Bonjour,J'ai voulu faire un programme permettant de garder une fenetre au dessus de tous les autres avec la fonction setwindowpos() de l'api win32. Ce


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,889 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales