[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 :
- HookClavierDll : je compile une .dll, puis un .lib (choix dans les options du projet)
- Sources Files
- Hook clavier.cpp
Code:
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:
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:
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
- HookClavier.def
Code:
1
2
3
4 LIBRARY HookClavierDll EXPORTS Intercepte @1 Relache @2
- TestHook
- Sources Files
- main.cpp
Code:
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
- main.h
Code:
1
2
3
4
5
6 #pragma comment(lib, "../HookClavierDll/Debug/HookClavierDll.lib") extern "C" { int __stdcall Intercepte(); void __stdcall Relache(); }
- Resoources Files
- HookClavier.def
- HookClavier.lib