Bonjour,

En beau gros débutant en programmation windows, j'essaie de faire un hook clavier et je me heurte à un problème. Après m'être bien battu j'ai réussi à avoir quelque chose de fonctionnel mais il ne fonctionne qu'une seule fois. Au lancement de mon application la méthode de traitement est appelé à la pression d'une touche mais uniquement la 1ère pression. Par la suite plus rien ne se passe.

Voici le code de ma dll :

Hook.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

#ifdef HOOK_EXPORTS
#define HOOK_API __declspec(dllexport)
#else
#define HOOK_API __declspec(dllimport)
#endif

HOOK_API bool InstallHook(HWND hWnd, UINT uMyMsg);
HOOK_API bool UninstallHook();
HOOK_API LRESULT KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam);

Hook.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
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
88
89
90
91
92
93
#include "Hook.h"

static UINT uMsg = 0;
static HWND hWndMain = 0; 
static HHOOK hKeyHook = NULL;

HINSTANCE hInstance = 0; 
HOOKPROC lpfnHookProc = 0;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		hInstance = hModule;
        break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return true;
}

HOOK_API bool InstallHook(HWND hWnd, UINT uMyMsg)
{
	hWndMain = hWnd; 
	uMsg     = uMyMsg;
	lpfnHookProc = (HOOKPROC)KeyboardFunc; 
	hKeyHook = SetWindowsHookEx (WH_KEYBOARD, lpfnHookProc, hInstance, NULL);
	hWndMain = hWnd;

	if (hKeyHook) 
	{
	  return true; 
	}
	else 
	{
	  return false; 
	}
}

HOOK_API bool UninstallHook()
{
	return UnhookWindowsHookEx(hKeyHook);
}

HOOK_API LRESULT KeyboardFunc (int nCode, WPARAM wParam, LPARAM lParam)
{
   bool Processed = false;

   if (nCode < 0)
   {
      return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
   }
   if (nCode == HC_NOREMOVE)
   {   
	   return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
   }

   switch (wParam)
   {
   case VK_UP:
   case VK_DOWN:
       if (HIWORD(lParam) & 0xC000)
       {
			// keydown
       }
	   else
	   {
		   // keyup
		   PostMessage (hWndMain, uMsg, 0, 0);
	   }
       Processed = true;
       break;

  default :
       Processed = false ;
       break ;
  }

  if (Processed)
  {
     return true;
  }
  else
  {
     return (CallNextHookEx (hKeyHook, nCode, wParam, lParam));
  }
}
Si je debug, la méthode KeyBoardFunc() n'est appelé que la 1ère fois que j'appuie sur une touche puis plus jamais.