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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Récupèrer les événements WM_LBUTTONDOWN de toutes les fenêtres ouvertes


Sujet :

Windows

  1. #1
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut Récupèrer les événements WM_LBUTTONDOWN de toutes les fenêtres ouvertes
    Bonjour tout le monde !

    J'aimerais créer un petit programme avec l'API win32 qui me permette de compter combien de fois je clique sur la souris en une journée.
    Mais pour cela, il faudrait que je puisse récupérer les événements WM_LBUTTONDOWN de toutes les fenêtres ouvertes.
    Je n'ai pas trouvé grand chose traitant de ce sujet sur internet, à part la fonction SetWindowsHook.
    Mais je ne sais pas comment m'en servir.

    Pourriez-vous me donner plus d'explications ?

    Merci !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    Salut et merci pour ta réponse !

    J'ai lu le premier tuto que tu m'a donné et j'ai voulu voir si cela marchais en comptant le nombre de pression de la touche entrée.
    J'ai donc recopier le code de la dll (en remplaçant les _export par des __declspec(dllexport) car je suis sous code::blocks) et je l'ai compilé.
    J'ai ensuite fais une petite application qui affiche le nombre de pressions de la touche entrée, j'ai placé l'exécutable avec la dll, mais cela ne marche pas. De plus quand je ferme l'application, j'ai un message d'erreur windows.

    DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #include <windows.h>
    // Définition de la structure de la zone mémoire partagée
    
    typedef struct _TDonnees
    {
         HHOOK KeybdHookHandle; // Handle du hook du clavier
         HWND hDestWindow; // Handle de la fenêtre à laquelle le hook du clavier doit les données
    } TDonnees;
    
    // Déclaration des variables globales de la DLL
    HANDLE MemPartagee; // Handle de la zone de mémoire partagée
    TDonnees * VueDonnees; // Pointeur vers la zone de mémoire
    HINSTANCE HInst; // Handle d'intance de la DLL
    
    // Déclaration des fonctions de la DLL
    void _export InitHook(HWND hDest);
    void _export EndHook();
    LRESULT CALLBACK KeybdProc(int nCode,WPARAM wParam,LPARAM lParam);
    
    // fonction d'initialisation de la DLL
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
         HInst = hinst;
         switch (reason)
         {
              case DLL_PROCESS_ATTACH : // à la création de l'instance de la DLL
                   // Attachement d'une zone de mémoire partagée (notez le cast)
                   MemPartagee = CreateFileMapping((HANDLE)0xFFFFFFFF, // On map un espace mémoire
                                            NULL, // Pas d'informations de sécurité
                                            PAGE_READWRITE, // Partage en lecture/écriture
                                            0, // Taille de la zone réservée sur 64 bits (32 bits de poid fort)
                                            sizeof(TDonnees), // 32 bits de poids faible
                                            "Tutoriel Hooks par gRRosminet"); // Nom de la zone réservée
    
                   // Création d'une vue pour pouvoir accéder à la zone de mémoire partagée (notez le cast)
                   VueDonnees = (TDonnees *)(MapViewOfFile((HANDLE)MemPartagee, // Zone sur laquelle créer la vue
                                            FILE_MAP_WRITE, // Mode d'accès en lecture/écriture
                                            0, 0, // Offset de début de la vue sur 64 bits
                                            0)); // Taille de la vue (0 = tout)
                                            break;
    
              case DLL_PROCESS_DETACH : // au détachement de la DLL
                   // Destruction de la vue sur la zone de mémoire partagée
                   UnmapViewOfFile((LPVOID)VueDonnees);
                   // Détachement de la zone de mémoire partagée
                   CloseHandle(MemPartagee);
                   break;
    
              default :
                   // DLL_THREAD_ATTACH, DLL_THREAD_DETACH
                   break;
         }
         return 1;
    }
    
    void __declspec(dllexport) InitHook(HWND hDest) // _export est spécifique à BCB
    {
    
         // Installation du hook pour le clavier
         VueDonnees->KeybdHookHandle = SetWindowsHookEx(WH_KEYBOARD, // Créer un hook sur le clavier
                                                 (HOOKPROC)KeybdProc, // Utiliser la fonction KeybdProc
                                                 HInst, // Dans la DLL d'instance HInst
                                                 0); // Pour tous les threads
    
    
         // Partage de la fenêtre destinatrice des données du clavier
         VueDonnees->hDestWindow = hDest;
    }
    
    void __declspec(dllexport) EndHook()
    {
         // Supression des hooks
         UnhookWindowsHookEx(VueDonnees->KeybdHookHandle);
    }
    
    #define WMAP_KEYBDHOOKMSG WM_APP + 1
    
    LRESULT CALLBACK __declspec(dllexport) KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
         // On envoie un message WMAP_KEYBDHOOKMSG à chaque fois que
    	 // l'utilisateur presse la touche ENTREE
         if(wParam == VK_RETURN)    PostMessage(VueDonnees->hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);
    
         return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
    }
    Prog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <windows.h>
    #include <stdio.h>
    
    #define ID_LABEL1 1001
    #define ID_LABEL2 1002
    
    #define WMAP_KEYBDHOOKMSG WM_APP + 1
    
    LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
    
    typedef void (*TInitFunc)(HWND);
    typedef void (*TEndFunc)();
    TInitFunc InitHooks;
    TEndFunc EndHooks;
    
    HINSTANCE instance;
    HINSTANCE dll;
    
    int WinMain(HINSTANCE this_instance, HINSTANCE prev_instance, LPSTR cmd_line, int view_mod)
    {
        WNDCLASS wnd_class;
        wnd_class.style = 0;
        wnd_class.lpfnWndProc = WindowProcedure;
        wnd_class.cbClsExtra = 0;
        wnd_class.cbWndExtra = 0;
        wnd_class.hInstance = NULL;
        wnd_class.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wnd_class.hCursor = LoadCursor(NULL, IDC_ARROW);
        wnd_class.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
        wnd_class.lpszMenuName =  NULL;
        wnd_class.lpszClassName = "wnd_class";
        instance = this_instance;
        if(!RegisterClass(&wnd_class))    return false;
    
        HWND wnd = CreateWindow("wnd_class", "CounterClic", WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 220, 100, NULL, NULL, this_instance, NULL);
        if(!wnd)    return false;
    
        ShowWindow(wnd, view_mod);
        UpdateWindow(wnd);
    
        MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure(HWND wnd, UINT msg, WPARAM w_param, LPARAM l_param)
    {
        static HWND label1, label2;
        static int counter;
    
        switch(msg)
        {
            case WM_CREATE :
                label1 = CreateWindow("STATIC", "Number of clicks :", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 10,  25, 150, 60, wnd, (HMENU)ID_LABEL1, instance, NULL);
                label2 = CreateWindow("STATIC", "0",                  WS_CHILD | WS_VISIBLE | SS_NOTIFY, 133, 25, 55,  60, wnd, (HMENU)ID_LABEL2, instance, NULL);
    
                dll = LoadLibrary("mydll.dll");
                if(!dll)    PostQuitMessage(0);
    
                InitHooks = (TInitFunc)GetProcAddress(dll, "_InitHook");
                EndHooks =  (TEndFunc) GetProcAddress(dll, "_EndHook");
    
                return 0;
    
            case WMAP_KEYBDHOOKMSG :
            {
                counter++;
                char nbr[6] = {0};
                sprintf(nbr, "%i", counter);
                SetWindowText(label2, nbr);
                InvalidateRect(wnd, 0, 0);
                return 0;
            }
    
            case WM_DESTROY :
                EndHooks();
                PostQuitMessage(0);
                return 0;
    
            default : return DefWindowProc(wnd, msg, w_param, l_param);
        }
    }

Discussions similaires

  1. Réponses: 9
    Dernier message: 15/05/2007, 14h28
  2. Les fichiers .INI, lire toutes les informations d'une section
    Par echap2000 dans le forum C++Builder
    Réponses: 9
    Dernier message: 15/05/2006, 12h14
  3. Mettre à jour les if et variable toute les x seconde.
    Par Guillaume602 dans le forum C++
    Réponses: 5
    Dernier message: 06/12/2005, 19h09
  4. Lister toutes les clés étrangères de toutes le tables
    Par Samish dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/08/2005, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo