SetWindowsHookEx pour WH_MOUSE

J'ai un peu de code dans mes mains qui imprime les coordonnées de la souris à l'échelle mondiale (à l'aide de WH_MOUSE_LL). Mon objectif est d'utiliser le WH_MOUSE au lieu de WH_MOUSE_LL parce que (d'après ce que j'ai lu) c'est plus rapide. J'ai lu sur le forum que lors de l'utilisation de WH_MOUSE il doit être déclaré dans une DLL pour atteindre l'effet global, mais encore, lorsqu'il est utilisé dans le programme, il doit travailler plus que d'application où il a été déclaré, mais il ne fonctionne pas (il imprime rien) quand je viens de changer la WH_MOUSE_LL à WH_MOUSE. C'est le code:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )

#include <windows.h>
#include <stdio.h>

HHOOK hMouseHook;

LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
    if (pMouseStruct != NULL){
        if(wParam == WM_LBUTTONDOWN)
        {
            printf( "clicked" ); 
        }
        printf("Mouse position X = %d  Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
    }
    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);

    //here I put WH_MOUSE instead of WH_MOUSE_LL
    hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );

    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }

    UnhookWindowsHookEx(hMouseHook);
    return 0;
}

int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
    if (hThread)
        return WaitForSingleObject(hThread,INFINITE);
    else
        return 1;

}
Certains hooks ne fonctionnera pas, sauf si ils sont dans une DLL. Lorsque votre crochet doit être invoqué et est un type de crochet qui doit être à l'intérieur de chaque processus, Windows gère le chargement de la DLL et de mise en œuvre dans tous les processus. IIRC, à la fois le clavier et la souris des crochets doit être dans une DLL pour fonctionner partout.

OriginalL'auteur tobi | 2012-06-24