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
Vous devez vous connecter pour publier un commentaire.
Quatrième param doit également être changé à GetCurrentThreadId() afin de rendre les locaux.
Une application console n'est pas la meilleure app pour tester ce genre de choses. La fenêtre de la console est dans un autre processus. Essayez de créer une nouvelle fenêtre via CreateWindow si vous souhaitez tester.
merci, j'ai une autre question. De ce que j'ai lu en plaçant le crochet dans une DLL, il injecte des processus. Ça veut dire que la capture de la souris sur mon bureau, menu démarrer, etc. trop? Quid de la barre de titre des applications? J'ai vu quelques posts sur Internet avec de tels problèmes, mais ne sais pas si ils ont échoué à quelque chose ou il y a une sorte de limitation (ou une autre).
Devrait fonctionner. Mondial crochets s'applique à tous les processus, y compris la explorer.exe. Méfiez-vous que la Dll 32 bits ne peut être injecté dans les processus 32 bits et 64 bits Dll ne peut être injecté dans les processus 64 bits.
OriginalL'auteur Yuhong Bao
puisque vous avez un "principal", je suppose que vous vous auriez besoin de faire une dll pour que cela fonctionne pour les messages autres que l' *_LL type
Comprendre le faible niveau de la souris et du clavier crochet (win32)
http://developer-resource.blogspot.com/2008/07/setwindowshookex-example.html a une dll exemple
OriginalL'auteur rogerdpack