Hook souris et Windows 7 64 bits [Résolu]

Messages postés
111
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
24 juin 2015
- - Dernière réponse : thenaoh
Messages postés
111
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
24 juin 2015
- 10 nov. 2010 à 10:49
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, j'ai vu qu'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 :

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) :

#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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
3
Merci
Exemple sur Win7 x64 qui va impec.

Une DialogBox avec 2 boutons et 1 static pour info.
On lance le hook par le bouton, focus sur Chrome, VS ou autre prog 32 bits et la dialogBox se déplace bien en position 10,10 quand il faut.
Tout ça en 1 exe de 3.5 Ko.

#include <windows.h>
#include "resource.h"

HINSTANCE hinst = 0;
HHOOK hhk = 0;
HWND hmain = 0;
HWND hinfo = 0;

__declspec(dllexport) LRESULT lowMoseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSLLHOOKSTRUCT *pMS;
if(nCode < 0) goto defRet;
if(wParam != WM_MOUSEMOVE) goto defRet;
pMS = (MSLLHOOKSTRUCT*) lParam;
if(pMS->pt.x > 1200) SetWindowPos(hmain, 0, 10, 10, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
return 0;
defRet:
return CallNextHookEx(hhk, nCode, wParam, lParam);
}

INT_PTR AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg) {
case WM_INITDIALOG:
hmain = hdlg;
SetClassLongPtr(hdlg, GCLP_HICON, (LONG_PTR) LoadIcon(0, IDI_APPLICATION));
hinfo = GetDlgItem(hdlg, IDST_INFO);
return 1;
case WM_COMMAND:
switch(wParam) {
case IDBT_HOOK:
if(hhk) break;
hhk = SetWindowsHookEx(WH_MOUSE_LL, lowMoseProc, hinst, 0);
if(hhk) SetWindowText(hinfo, "HOOK");
break;
case IDBT_UNHOOK:
if(!hhk) break;
UnhookWindowsHookEx(hhk);
hhk = 0;
SetWindowText(hinfo, 0);
break;
case IDCANCEL:
if(hhk) UnhookWindowsHookEx(hhk);
EndDialog(hdlg, 0);
}
}
return 0;
}

#pragma comment(linker, "/entry:myWinMain")
void __fastcall myWinMain()
{
hinst = GetModuleHandle(0);
DialogBoxParam(hinst, MAKEINTRESOURCE(IDD_APP), 0, AppDlgProc, 0);
ExitProcess(0);
}


ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 159 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
0
Merci
Souris et clavier sont des "shared" ressources, il est donc possible de faire un hook global sur ces 2 ressources sans DLL.

Fais seulement un exe 64 et teste avec la fonction de hook dans l'exe.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
111
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
24 juin 2015
0
Merci
Merci BruNews, je n'avais pas pensé à cette possibilité, en effet !

J'ai donc réalisé un hook sans DLL tout simple, en m'inspirant d'un exemple existant, mais qui non seulement ne détecte pas mes clics de souris, mais en plus rend le déplacement de mon curseur de souris particulièrement lent (bon cette fois j'ai testé sous XP). Voici le code :

#define _WIN32_WINNT 0x0400
#include <windows.h>

HHOOK hHook;    // Handle du hook global
HINSTANCE hExe; // Handle de notre exécutable

// Fonction de gestion du hook 
__declspec(dllexport) LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam) 
{
    if  ((nCode >0) && (wParam WM_LBUTTONDOWN))
    {
        MessageBox(NULL, "clic !", "Clic", MB_ICONINFORMATION);
    }
    
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

// Fonction principale.
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd, int nShow )
{
    hExe = GetModuleHandle(NULL);
    hHook  = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC) HookProc, hExe, 0);
    
    while(!(GetAsyncKeyState(VK_F8)))
    {
Sleep(500);
    }
    
    UnhookWindowsHookEx(hHook);
    
    return 0;
}


Le but de ce programme sera de m'écrire sur la sortie standard le mot "clic" (par exemple) dès que l'utilisateur clique avec le bouton gauche de sa souris. Ici je teste avec une MessageBox, mais elle ne s'affiche jamais.

J'ai beau chercher, je ne comprends pas d'où vient le problème. Une idée ?

Merci !
Commenter la réponse de thenaoh
Messages postés
111
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
24 juin 2015
0
Merci
Wha cool ! Merci beaucoup !!
Bon maintenant faut que ça cause sur la sortie standard et ne faire apparaître aucune fenêtre, m'enfin je devrais y arriver.
Merci !
Commenter la réponse de thenaoh