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

C++ Discussion :

Hook Clavier sans DLL


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut Hook Clavier sans DLL
    [EDIT]Je vous conseille d'aller directement au troisième post : comment créer un hook clavier sans dll ?[/EDIT]

    Bonjour à tous.
    Je crée un hook clavier afin de lancer une application lors de l'appuie sur la touche ImprEcran. Le soucis est que d'une part le DllMain de la dll de mon hook n'est jamais executée, et dernièrement j'obtients des erreurs de linker.

    Ce que j'espère obtenir : un programme qui tourne en fond (TestHook) et qui intercepte l'appuie sur la touche ImprEcran. Une fois l'appuie détecté, un programme est excécuté (SheelExecute()).

    Mes soucis :
    • error LNK2019: symbole externe non résolu _Intercepte@0 référencé dans la fonction _WinMain@16
    • error LNK2019: symbole externe non résolu _Relache@0 référencé dans la fonction _WinMain@16
    • DllMain() jamais excécuté



    Je vous envoie par la suite ma solution complète. N'hésitez pas à me poser des questions. Je vous remercie grandement.

    J'utilise VC++ 2003.
    Ma solution :
    1. HookClavierDll : je compile une .dll, puis un .lib (choix dans les options du projet)
      • Sources Files
        • Hook clavier.cpp
          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
          // HookClavierDLL.cpp : définit le point d'entrée pour l'application DLL.
          //
           
          #include "stdafx.h"
          #include <windows.h>
          #include <shellapi.h>
           
          HINSTANCE hThisModule;
          HHOOK hHook;
           
          extern "C" __declspec(dllexport) BOOL APIENTRY DllMain( HINSTANCE hModule, 
             DWORD  ul_reason_for_call,
             LPVOID lpReserved
          )
          {
          	if(ul_reason_for_call == DLL_PROCESS_ATTACH)
          		hThisModule = hModule;
              return true;
          }
           
          LRESULT CALLBACK GetMessages(int nCode, WPARAM wParam, LPARAM lParam)
          {
          	if(nCode < 0)
          		return CallNextHookEx(hHook, nCode, wParam, lParam);
          	if( (wParam == SC_SCREENSAVE) && (!(lParam & 0x80000000)) )
          	{
          		// La touche ImprEcran a été enfoncée !
          		HWND hwnd;
          		ShellExecute(hwnd, "open", "C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\ScreenSharer\\TestScreenSharerDll\\Debug\\TestScreenSharerDll.exe", NULL, NULL, SW_NORMAL);
          	}
          		return CallNextHookEx(hHook, nCode, wParam, lParam);
          }
           
          extern "C" int __stdcall Intercepte()
          {
          	if(!hHook)
          		hHook  = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetMessages, hThisModule, 0);
          	return (int) hHook;
          }
           
          extern "C" void __stdcall Relache()
          {
          	if(hHook)
          	{
          		UnhookWindowsHookEx(hHook);
          		hHook = 0;
          	}
          }
        • stdafx.cpp
          Code : Sélectionner tout - Visualiser dans une fenêtre à part
          1
          2
          3
          4
          5
          // stdafx.cpp : fichier source incluant simplement les fichiers Include standard 
          // Hook clavier.pch représente l'en-tête précompilé
          // stdafx.obj contient les informations de type précompilées
           
          #include "stdafx.h"
      • Header Files
        • stdafx.h
          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
          // stdafx.h : Fichier Include pour les fichiers Include système standard,
          // ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment,
          // et sont rarement modifiés
          //
           
          #pragma once
           
           
          // Insérez ici vos en-têtes
          #define WIN32_LEAN_AND_MEAN		// Exclure les en-têtes Windows rarement utilisés
           
          #include <windows.h>
          #include <stdio.h>
           
          //Inclure les en-têtes ODS
          #ifdef __cplusplus
          extern "C" {
          #endif 
           
          #include <Srv.h>		// Fichier d'en-tête principal qui contient tous les autres fichiers d'en-tête
           
          #ifdef __cplusplus
          }
          #endif
      • Resoources Files
    2. TestHook
      • Sources Files
        • main.cpp
          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
          #include <windows.h>
          #include <stdio.h>
          #include "main.h"
           
          int APIENTRY WinMain(HINSTANCE hInstance,
                               HINSTANCE hPrevInstance,
                               LPSTR     lpCmdLine,
                               int       nCmdShow)
          {
            Intercepte();
            DWORD RunTime = GetTickCount();
            DWORD Now = GetTickCount();
            while(Now - RunTime < 10000)
          	  Now = GetTickCount();
           
            Relache();
            MessageBeep(-1);
           
            return 0;
          }
      • Header Files
      • Resoources Files
        • HookClavier.def
        • HookClavier.lib

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'ai simplifié mon problème. Il est possible de créer un hook sans utiliser de dll. Je me suis prété au jeu :

    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
    #include <windows.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)
    {
        if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
        {
    		if(lParam == VK_SUBTRACT)
    		{
    			MessageBeep(-1);
    		}
        }
       // Renvoi des messages au sytème pour permettre d'autres hooks
       return CallNextHookEx(hHook, nCode, wParam, lParam);
     
    }
     
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	// Activer le hook
    	hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) HookProc, GetModuleHandle(NULL), NULL);
     
    	DWORD RunTime = GetTickCount();
    	DWORD Now = GetTickCount();
    	while(Now - RunTime < 10000)
    		Now = GetTickCount();
     
    	// Desactiver le hook
    	UnhookWindowsHookEx(hHook);
     
    	// On avertit de la fin du programme
    	MessageBeep(-1);
    	return 0;
    }
    Cela ne fonctionne pas :
    la compilation : OK
    à l'execution, mon programme fonctionne 10s (comme prévu), mais jamais le CALLBACK n'est executé :'(


    Si quelqu'un avait la moindre idée de quelle pourrait être l'éventuelle raison qu'il soit envisageable qu'une modification puisse probablement améliorer les choses ...
    Merci.

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    J'ai finalement trouvé réponse à mes question. Pour information, voici comment créer un HookClavier sans utiliser de dll.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // main.h
    #define _WIN32_WINNT 0x0400
    #define PRINT_SCREEN 44
    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
    // main.cpp
    #include "main.h"
    #include <windows.h>
    #include <stdio.h>
     
    HHOOK hHook; // Handle du hook global
    HINSTANCE hExe; // Handle de notre exécutable
     
    // Fonction de gestion du hook
    LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam)
    {
    	// Structure recevant les informations de la DLL après un snapshot
    	static SnapshotAnswer Answer;
     
    	// Si une touche a été pressée
    	if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
        {
    		// Structure de récupération d'infos sur la touche tapée
            KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);
     
    		// Si la touche pressée est la touche PrintScreen
    		if(hookstruct.vkCode == PRINT_SCREEN)
    		{
    			// TODO : ajouter le code
    		}
        }
       // Renvoi des messages au sytème pour permettre d'autres hooks
       return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
     
    /*
     * ENTREE DU PROGRAMMME
     ****************************/
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	// On active le hook
    	hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)HookProc, hInstance, NULL);
     
    	// On interprete les messages
    	MSG msg;
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
     
    	// On désactive le hook
    	UnhookWindowsHookEx(hHook);
     
    	// The End
        return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Hook sans dll ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 02/12/2005, 10h05
  2. hook clavier
    Par bou3 dans le forum Windows
    Réponses: 5
    Dernier message: 14/06/2005, 17h12
  3. Hook Clavier et changement de touche
    Par Fly_57 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 09/08/2004, 19h42
  4. [Hook] Clavier Microsoft office keyboard
    Par merzhin dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/06/2004, 13h59
  5. [Turbo Pascal] Lire une touche au clavier sans interrompre le programme
    Par Allelouia dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 29/03/2003, 22h31

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