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 94 95
| //struct pour le hook
typedef struct _TDataHook
{
HHOOK KeyHookHandle; // handle du hook clavier
HHOOK CBTHookHandle; // handle du hook CBT
HWND hDestWindow;
} TDataHook;
//variables pour le hook
HANDLE MemPartagee; // handle de la zone de mémoire partagée
TDataHook *VueDonnees; // pointeur vers la zone de mémoire
HINSTANCE HInst; // handle d'instance de la DLL
DWORD ThId; // récupération de l'ID du thread 'appellant'
//Déclaration des fonctions de la DLL
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); // fonction hook du clavier
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam); // fonction hook de destruction de control
int __stdcall InitHook(HWND hDest); // fonction initialisant le hook
int __stdcall EndHook(); // fonction mettant fin au hook
#pragma argsused
//---------------------------------------------------------------------------
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(TDataHook), // 32 bits de poids faible
"HookPopup"); // 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 = (TDataHook *)(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 :
UnmapViewOfFile((LPVOID)VueDonnees);
CloseHandle(MemPartagee);
break;
default : break;
}
return 1;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
PostMessage(VueDonnees->hDestWindow, WMAP_SENDSMSG, wParam, lParam); // envoie du message vers la fonction de réception de l'application
return CallNextHookEx(VueDonnees->KeyHookHandle,nCode, wParam, lParam); // envoie le message au prochain hook présent dans la chaine
}
//---------------------------------------------------------------------------
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode == HCBT_DESTROYWND) // si on change de control, on arrête le hook
{
PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0); // on prévient l'application de la fin du hook
EndHook(); // le hook est stoppé
}
return CallNextHookEx(VueDonnees->CBTHookHandle, nCode, wParam, lParam);
}
//---------------------------------------------------------------------------
int __stdcall InitHook(HWND hDest)
{
if (VueDonnees == NULL) // si aucun hook n'existe
{
VueDonnees = new _TDataHook(); // on crée une nouvelle structure
}
int Result;
try {
ThId = GetCurrentThreadId(); // on garde une trace du thread responsable du hook
VueDonnees->KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL, ThId); // on utilise le hook clavier pour récupérer les commandes
VueDonnees->CBTHookHandle = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,NULL, ThId); // on utilise le hook permettant de vérifier le changement de control actif
VueDonnees->hDestWindow = hDest; // on stocke l'initiateur de la demande
PostMessage(VueDonnees->hDestWindow, WMAP_INITHOOKMSG, 0, 0); // informe l'application que le hook est initialisé
Result = 0;
}
catch (...)
{
Result = 1;
}
return Result;
}
//---------------------------------------------------------------------------
int __stdcall EndHook()
{
UnhookWindowsHookEx(VueDonnees->KeyHookHandle); // on arrête les 2 hooks
UnhookWindowsHookEx(VueDonnees->CBTHookHandle);
return 0;
} |
Partager