2010-10-02 41 views
2

J'essaye de configurer le crochet de la souris sur le fil d'arrière-plan.LowLevelMouseProc dans le fil d'arrière-plan

delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); 
LowLevelMouseProc _proc = HookCallback; 
SetWindowsHookEx(PInvoke.WH_MOUSE_LL, _proc, IntPtr.Zero, 0); 

et

IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam){/**/} 

Si je mets cela sur le principal tout fil de fenêtre fonctionne jusqu'à ce que la fenêtre doit faire un travail plus complexe qui provoque la souris pour cesser de répondre pendant toute la durée de ce travail (mise à jour plusieurs enfants dans le panneau par exemple).

Si je démarre un nouveau thread et à partir de là mettre en place le crochet, le problème est le thread se termine simplement après la mise en place de la fonction de rappel et de rappel n'est jamais appelé.

Y a-t-il un moyen de garder le fil en vie à cette fin? Ou s'il existe un autre moyen de brancher la souris sans risquer de ne pas réagir?

Je remarqué que lorsque accidentaly thread de travail exécute

GetMessage(out msg, new IntPtr(0), 0, 0); 

Aucun message ne jamais recieved mais fil est maintenu en vie dans le but requis. Aussi, j'ai besoin d'une manière élégante de fermer le fil, mais GetMessage ne revient jamais.

Je ne comprends pas tout à fait tous ces messages, je veux simplement pouvoir brancher la souris et la sécuriser contre le gel.

Toute aide est appréciée.

Répondre

0

Dans votre méthode de rappel hook, lancez simplement un nouveau thread. N'oubliez pas d'invoquer sur votre thread principal si votre traitement nécessite l'accès à vos formulaires sur les contrôles.

EDIT:

Si vous faites quelque chose sur votre thread principal de formulaire qui est le gel de l'interface utilisateur, vous devriez envisager de faire cette action dans un thread d'arrière-plan au lieu du fil principal. Lorsque vous devez mettre à jour les contrôles à la suite de votre traitement, vous pouvez l'appeler.

this.WhateverControl.Invoke(/* ... /*);

0

crochet bas de la souris de niveau nécessite boucle de message en cours d'exécution dans le thread qui a appelé SetWindowsHookEx. C'est pourquoi il ne fonctionne pas dans un thread d'arrière-plan simple et fonctionne dans le thread UI. Si vous souhaitez utiliser ce hook dans le thread d'arrière-plan, appelez la méthode Application.Run après SetWindowsHookEx. Le fil reste dans cette boucle et gère les messages de hook bas niveau.