Hook souris et Windows 7 64 bits
Bonjour,
Je cherche désespérément à faire fonctionner un hook souris basique réalisé en C++. Le hook doit fonctionner sous Windows 7 64 bits, où on peut donc y rencontrer des applications 32 et 64 bits.
Après plusieurs recherches, il me faut donc en gros réaliser 2 hooks, un compilé en 32 bits pour les applications 32 bits, un autre compilé en 64 bits pour les applications 64 bits.
J'ai trouvé un bout de code me permettant de faire la distinction entre les applications 32 et 64 bits, mais mon problème est que je ne sais pas comment le mettre en place ...
Le code faisant cette distinction d'applis est le suivant :
Code:
1 2 3 4 5 6 7 8 9 10
|
HWND hwnd;
DWORD ProcID;
HANDLE hProc;
BOOL bWOW64Proc = FALSE;
GetWindowThreadProcessId(hwnd, &ProcID);
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
IsWow64Process(hProc, &bWOW64Proc);
CloseHandle(hProc); |
Le code de ma DLL où est codé mon hook, tout ce qu'il y a de plus classique (il ne fait rien, c'est juste pour l'exemple) :
Code:
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
|
#include <windows.h>
#include <stdio.h>
HANDLE MemPartagee;
HINSTANCE thismod;
HHOOK hhk;
/**
* Init DLL.
*/
extern "C" __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
thismod = hDll;
}
return 1;
}
/**
* Fonction hook.
*/
LRESULT CALLBACK wndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_LBUTTONDOWN)
{
// Traitements du hook ...
}
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}
/**
* Démarrage du hook.
*/
extern "C" __declspec(dllexport) int __stdcall Intercepte()
{
if(!hhk)
{
hhk = SetWindowsHookEx(WH_MOUSE, wndProc, thismod, 0);
}
return (int) hhk;
}
/**
* Arrêt du hook.
*/
extern "C" __declspec(dllexport) void __stdcall Relache()
{
if(hhk)
{
UnhookWindowsHookEx(hhk);
hhk = 0;
}
} |
Quelqu'un saurait-il comment faire, ou plus généralement, comment réaliser un (ou 2) hook(s) souris fonctionnant sous Windows 7 64 bits ?
Merci par avance pour votre aide :ccool:
Ça ne veut pas marcher...
Hello.
Je rencontre quelques soucis avec mon système de hooks 32/64 bits.
Afin de peaufiner le truc, voici ce que j'ai fait :
- Une application principale (32 ou 64 bits)
- Un exécutable lié à une dll 32 bits
- Un exécutable lié à une dll 64 bits
L'application principale est une simple fenêtre avec 3 boutons :
- Un pour démarrer le lanceur 32 bits
- Un pour démarrer le lanceur 64 bits
- Un pour effectuer une série de tests
Les lanceurs sont de simples fenêtres (avec une zone de texte pour les logs)
L'application principale démarre bien chaque lanceur quand on le lui demande.
Ensuite, lors d'un premier clic sur le bouton "Test", elle demande à chaque lanceur de mettre en place les hooks
Lors d'un deuxième clic, on demande l'arrêt des hooks, et un troisième demande la fermeture des fenêtres "lanceurs" (et donc de l'application associée).
Les deux premières demandes se font vie des messages Windows "personnalisés" (créés avec RegisterWindowMessage).
Jusque là, tout fonctionne bien : les hooks sont biens démarrés sans code d'erreur en retour.
Le problème, c'est que suivant le type de hook, il ne semble pas fonctionner correctement.
Par exemple, pour un hook souris "classique" (WH_MOUSE), seuls les événements effectués sur la fenêtre du lanceur sont interceptés. J'ai pourtant bien spécifié "0" comme dernier paramètre de la fonction "SetwindowsHookEx".
J'ai le même comportement avec un hook de type WH_CBT.
Par contre, autre comportement étrange : si au lieu de créer un hook de type "WH_MOUSE", j'en crée un de type "WH_MOUSE_LL", ça marche nickel. Et surtout, chaque hook (32 et 64 bits) intercepte les messages pour tous les événements, qu'ils soient destinés à une fenêtre 32 ou 64 bits.
Je ne pense pas que le problème vienne du point soulevé par Andnotor dans le post précédent, car j'ai un comportement identique sun un Windows XP 32bits (avec un seul lanceur et une seule dll, bien entendu).
Si quelqu'un a des idées sur l'éventuelle provenance de ce problème, je suis preneur.
Merci d'avance, et @+
Xav'