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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
// Remarque importante concernant la gestion de mémoire de DLL lorsque votre DLL
// utilise la version statique de la bibliothèque d'exécution :
//
// Si votre DLL exporte des fonctions qui passent des objets String (ou des
// structures/classes contenant des chaînes imbriquées) comme paramètre
// ou résultat de fonction, vous devrez ajouter la bibliothèque MEMMGR.LIB
// à la fois au projet DLL et à tout projet qui utilise la DLL. Vous devez aussi
// utiliser MEMMGR.LIB si un projet qui utilise la DLL effectue des opérations
// new ou delete sur n'importe quelle classe non dérivée de TObject qui est
// exportée depuis la DLL. Ajouter MEMMGR.LIB à votre projet forcera la DLL et
// ses EXE appelants à utiliser BORLNDMM.DLL comme gestionnaire de mémoire.
// Dans ce cas, le fichier BORLNDMM.DLL devra être déployé avec votre DLL.
//
// Pour éviter d'utiliser BORLNDMM.DLL, passez les chaînes comme paramètres
// "char *" ou ShortString.
//
// Si votre DLL utilise la version dynamique de la RTL, vous n'avez pas besoin
// d'ajouter MEMMGR.LIB, car cela est fait automatiquement.
//---------------------------------------------------------------------------
#pragma argsused
//---------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
// Définition de la structure de la zone mémoire partagée
typedef struct _TDonnees
{
HHOOK MouseHookHandle; // Handle du hook de la souris
HHOOK KeybdHookHandle; // Handle du hook du clavier
HWND hDestWindow; // Handle de la fenêtre à laquelle le hook du clavier doit les données
// Mettez ici toutes les données que vous voulez partager
} TDonnees;
// Déclaration des variables globales de la DLL
HANDLE MemPartagee; // Handle de la zone de mémoire partagée
TDonnees * VueDonnees; // Pointeur vers la zone de mémoire
HINSTANCE HInst; // Handle d'intance de la DLL
LRESULT CALLBACK _export MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK _export KeybdProc(int nCode,WPARAM wParam,LPARAM lParam);
//---------------------------------------------------------------------------
// fonction d'initialisation de la DLL
//int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
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(TDonnees), // 32 bits de poids faible
"Tutoriel Hooks par gRRosminet"); // 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 = (TDonnees *)(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 : // au détachement de la DLL
// Destruction de la vue sur la zone de mémoire partagée
UnmapViewOfFile((LPVOID)VueDonnees);
// Détachement de la zone de mémoire partagée
CloseHandle(MemPartagee);
break;
default :
// DLL_THREAD_ATTACH, DLL_THREAD_DETACH
break;
}
return 1;
}
//---------------------------------------------------------------------------
extern "C" __stdcall void _export InitHook(HWND hDest) // _export est spécifique à BCB
{
// Installation du hook sur la souris
VueDonnees->MouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL, // Créer un hook sur la souris
(HOOKPROC)MouseProc, // Utiliser la fonction MouseProc
HInst, // Dans la DLL d'instance HInst
0); // Pour tous les threads
// Installation du hook pour le clavier
VueDonnees->KeybdHookHandle = SetWindowsHookEx(WH_KEYBOARD, // Créer un hook sur le clavier
(HOOKPROC)KeybdProc, // Utiliser la fonction KeybdProc
HInst, // Dans la DLL d'instance HInst
0); // Pour tous les threads
// Partage de la fenêtre destinatrice des données du clavier
VueDonnees->hDestWindow = hDest;
}
//---------------------------------------------------------------------------
extern "C" __stdcall void _export EndHook()
{
// Supression des hooks
UnhookWindowsHookEx(VueDonnees->MouseHookHandle);
UnhookWindowsHookEx(VueDonnees->KeybdHookHandle);
}
//---------------------------------------------------------------------------
#define WM_MOUSEHWHEEL 0x020E
#define MSG_WM_MOUSEHWHEEL(func)
#define WMAP_KEYBDHOOKMSG WM_APP + 1
LRESULT CALLBACK _export MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MSLLHOOKSTRUCT *need = (MSLLHOOKSTRUCT*)lParam;
if (wParam == WM_MOUSEHWHEEL )
{
int m = need->mouseData ;
if( m > 0 ) {
keybd_event(0x11,0,0,0);
keybd_event(0x56,0,0,0);
keybd_event(0x11,0,KEYEVENTF_KEYUP,0);
keybd_event(0x56,0,KEYEVENTF_KEYUP,0);
}
else {
keybd_event(0x11,0,0,0);
keybd_event(0x43,0,0,0);
keybd_event(0x11,0,KEYEVENTF_KEYUP,0);
keybd_event(0x43,0,KEYEVENTF_KEYUP,0);
}
PostMessage(VueDonnees->hDestWindow,m, 0, 0);
}
return CallNextHookEx(VueDonnees->MouseHookHandle,nCode,wParam,lParam);
}
#define WMAP_KEYBDHOOKMSG WM_APP + 1
//---------------------------------------------------------------------------
LRESULT CALLBACK _export KeybdProc(int nCode,WPARAM wParam,LPARAM lParam)
{
// On envoie un message WMAP_KEYBDHOOKMSG à chaque fois que
// l'utilisateur presse la touche ENTREE
if (wParam == VK_RETURN)
PostMessage(VueDonnees->hDestWindow, WMAP_KEYBDHOOKMSG, 0, 0);
return CallNextHookEx(VueDonnees->KeybdHookHandle,nCode,wParam,lParam);
}
//--------------------------------------------------------------------------- |
Partager