| 12
 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