Comprendre le crochet de la souris et du clavier de bas niveau (win32)

Je suis en train de capture global de la souris et du clavier.

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
}

De sorte que tout fonctionne, sauf si je #define TEST à mettre dans le Sleepla souris devient incroyablement lent, comme si soudain j'ai autoriser uniquement la souris pour mettre à jour 20 fois par seconde. Et sans sommeil, je suis le rattachement de la CPU à 100%. Mais c'est bien pour l'instant (qui s'en va si j'utilise GetMessage).

Maintenant que je le comprends, le faible niveau des crochets de travail par commutation de contexte le processus qui l'a installé, et l'envoi du processus d'une sorte de message à laisser exécuter le crochet de rappel. Ce qui me confond un peu, cependant, c'est pourquoi mon programme ne sera jamais imprimer "msg recvd", mais il imprime "droit de la souris vers le bas/haut" chaque fois que je clique sur le bouton droit de la souris. Ce qui m'amène à conclure que mon MouseHookProc est invoquée au cours de la PeekMessage appel. Il arrive juste à être une sorte de message spécial et PeekMessage retourne 0. Mais j'ai toujours besoin d'appeler PeekMessage ou l'équivalent.

Depuis mon programme doit faire un tas de choses, de toute évidence, je ne peux pas alourdir mon message boucle de pompage (celui qui appelle PeekMessage) par l'appel d'une autre fonction qui prend, dire 50ms de retour. Comment pourrais-je multithread mon programme afin de maintenir la réactivité de la souris tout en faisant un peu lourd de levage? Dans un multithread programme win32, il est toujours juste l'un message de la file d'attente, non?

Mise à jour: Après avoir lu sur la MS de la documentation, je pense que je sais ce que la bonne chose à faire pour moi est. Je devrais juste frayer un thread dans mon application qui appelle SetWindowsHookEx pour enregistrer le point de raccordement de souris, et puis s'asseoir autour dans son propre message en boucle, et le système se chargera de l'envoi de la souris mises à jour de ce thread. Il sera libre de faire ce qu'il veut au sein de la MouseHookProcet le reste de mon application va fonctionner de façon indépendante.

source d'informationauteur Steven Lu