[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