IMessageFilter : événements MouseMove / MouseEnter / MouseLeave au niveau d'un contrôle, sans tenir compte des contrôles enfants
Les messages Windows, WM_MOUSE* dans notre cas, sont envoyés directement sur le contrôle concerné.
Si vous surchargez la méthode WndProc d'un contrôle "conteneur", vous ne verrez par conséquent pas les messages WM_MOUSEMOVE pour autant que le pointeur soit situé au dessus d'un contrôle enfant.
En gros les zones situées sous ces contrôles enfants sont des "zones mortes".
Pire, ce fonctionnement peut aussi être génant dans certains cas :
l'évènement MouseLeave sera par exemple déclenché si le curseur passe de la surface visible du contrôle conteneur à la surface d'un contrôle enfant.
Une solution pour éviter ces "zones mortes" peut être de passer par une implémentation de l'interface IMessageFilter dont on ajoutera une instance via Application.AddMessageFilter.
Si vous ne voyez pas trop ce dont je veux parler, téléchargez la source sur CSharpFR, et tester le mouvement de la souris au dessus d'un contrôle, avec et sans le CheckBox coché.
Dans l'exemple je change la couleur de fond du panel sur les events MouseEnter et MouseLeave (oui, j'ai piquer l'idée de Bidou ^^)

EDIT : tout compte fait allez aussi voir le code sur CSharpFR, le blog encaisse (très) mal les blocs de code.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :