2010-08-12 42 views
3

hélicos,gel SetWindowsHookEx WH_MOUSE sur point d'arrêt dans Win7

sur Windows XP mon application a utilisé une mousehook globale sucessfully pour récupérer MousePosition et clics, même si elle n'a pas le focus. le crochet est dans une .dll séparée et est en cours d'initialisation comme celui-ci (en delphi):

SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0); 

maintenant Win7 En gros, cela fonctionne aussi pendant l'exécution, mais je ne peux plus déboguer mon application bien (que je peux sous XP). dès que je frappe un point d'arrêt, Win7 se fige complètement. Je ne peux pas passer à un autre processus (même le gestionnaire de tâches ne s'ouvre pas). Si j'ai de la chance, je peux arrêter mon processus dans l'IDE. la plupart du temps si je dois redémarrer/se déconnecter pour retrouver l'accès.

Je sais que le problème est lié au crochet de la souris car il n'est pas présent si je n'utilise pas le crochet. c'est même si mon hookprocedure ne fait rien, mais ce qui suit:

CallNextHookEx(MouseHook, Code, wParam, lParam); 

ie. simplement la présence du crochet cause les ennuis. Avoir globalhooks.dll écrire quelque chose dans le EventLog je vois qu'il est toujours actif même pendant que je suis sur un point d'arrêt.

J'ai essayé d'utiliser un hook de lowlevelmouse via WH_MOUSE_LL qui fonctionne fondamentalement mais qui me donne des étranges retards de déplacement de souris lors de l'installation du hook et parfois lors du redimensionnement d'une fenêtre. il y a aussi un gel pendant quelques secondes quand on atteint un point d'arrêt mais au moins le système récupère après ~ 5 secondes ... donc cette option est encore pire car elle affecte aussi le temps d'exécution.

toute idée pourquoi le crochet WH_MOUSE bloque mon application pendant le débogage en premier lieu?

Répondre

1

si vous le débogage d'une application que vous ne devriez pas utiliser HInstance. Vous vous injectez le .exe lui-même dans le processus global, lorsque vous êtes mise au point tout le traitement de l'arrêt de la souris qui pourrait expliquer votre problème.

Les états de la documentation de SetWindowsHookEx permettent de passer 0 lors de l'accostage dans un processus propre et de gérer une DLL lors de l'accrochage à un processus distant ou global.

Vérifiez également que MouseHookCB() restaure la valeur de CallNextHookEx.