Salut

Je me suisinteressé au tuto de Charles :Click

Et je l ai modifié pour modifier le comportement des boutons de la molette qui servent normalement au scroll horizontal

Le code de la dll ne change pas

Voici le 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
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);
}
//---------------------------------------------------------------------------
Voilà en esperant que çà serve un jour à quelqun