J'essaye de capturer l'entrée globale de la souris et du clavier.Comprendre le hook de la souris et du clavier de bas niveau (win32)
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
if (wParam == WM_RBUTTONDOWN) printf("right mouse down\n");
if (wParam == WM_RBUTTONUP) printf("right mouse up\n");
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
while(true) {
MSG msg;
if (PeekMessage(&msg,0,0,0,PM_REMOVE)) {
printf("msg recvd\n");
TranslateMessage(&msg);
DispatchMessage(&msg);
}
#ifdef TEST
Sleep(50);
#endif
}
que tout fonctionne ici, sauf si je #define TEST
à mettre dans le Sleep
, la souris devient incroyablement lent, comme on pouvait s'y attendre si je laisse tout à coup que la souris pour mettre à jour 20 fois par seconde. Et sans le sommeil, je suis en train de fixer le CPU à 100%. Mais ça va pour l'instant (ça s'en va si j'utilise GetMessage
). Maintenant, si je comprends bien, les hooks de bas niveau fonctionnent en basculant le contexte vers le processus qui l'a installé, puis en envoyant au processus une sorte de message pour le laisser exécuter le rappel de hook. Ce qui m'embarrasse un peu, c'est pourquoi mon programme n'imprimera jamais "msg recvd", mais il imprime "right mouse down/up" chaque fois que je clique sur le bouton droit de la souris. Cela m'amène à conclure que mon MouseHookProc
est appelé pendant l'appel PeekMessage
. Il arrive juste d'être une sorte de message spécial et PeekMessage
renvoie 0. Mais je dois encore appeler PeekMessage
ou un équivalent. Comme mon programme doit faire un tas de choses, je ne peux clairement pas alourdir ma boucle de pompage de messages (celle qui appelle PeekMessage
) en appelant une autre fonction qui prend, disons 50ms à retourner. Comment pourrais-je multithread mon programme pour maintenir la réactivité de la souris tout en faisant un peu de levage lourd? Dans un programme Win32 multithread, il n'y a toujours qu'une seule file d'attente de messages, n'est-ce pas? Mise à jour: Après avoir lu la documentation de MS, je pense savoir ce que je dois faire. Je devrais juste engendrer un fil dans mon application qui appelle SetWindowsHookEx
pour enregistrer le crochet de souris, et puis asseoir autour dans sa propre boucle de message, et le système prendra soin d'envoyer les mises à jour de souris à ce fil. Il sera libre de faire tout ce qu'il veut dans le MouseHookProc
, et le reste de mon application fonctionnera indépendamment.
Avez-vous 'MouseHookProc' dans une DLL et' SetWindowsHookEx' et 'PeekMessage' dans un fichier EXE? – Oleg
Je voulais éviter d'avoir à injecter une DLL. Il semble plus adapté à mes besoins pour que le système bascule vers mon programme pour appeler son 'MouseHookProc', d'où la raison pour laquelle je veux utiliser le hook bas de la souris. Si je comprends bien, un hook de souris régulier, si je veux qu'il soit global, doit utiliser la méthode DLL. –