2010-03-25 2 views
0

J'ai une application Windows Forms qui utilise certains gestionnaires Application.Idle pour modifier l'état des contrôles sur le formulaire. Après avoir ajouté un ListView au formulaire, j'ai réalisé que les gestionnaires d'inactifs sont appelés trop souvent lorsque le curseur de la souris est sur ListView. En utilisant Spy ++, j'ai vu que lorsque le curseur de la souris est sur le contrôle (ne bouge pas), le contrôle reçoit les messages WM_MOUSEHOVER sur un over qui déclenche à son tour l'événement inactif (après que la file d'attente soit vide). La même chose s'applique à TreeView-Controls.Comment désactiver Hover-Messages dans .NET List/TreeViews?

Je me demande comment je peux désactiver ce comportement?

L'exécution de ce code à partir de l'invite de commande montrera ce que je veux dire:

using System; 
using System.Windows.Forms; 

public class IdleTest { 

    public static void Main() { 

     Application.Idle += delegate { 
      Console.WriteLine( 
       DateTime.Now.ToString() + " idle!") ; 
     }; 

     Form f = new Form(){ Width=300 }; 
     f.Controls.Add(new ListView(){ Left=0, Width=100 }); 
     f.Controls.Add(new TreeView(){ Left=100, Width=100 }); 
     f.Controls.Add(new TextBox() { Left=200, Width=100 }); 

     Application.Run(f) ; 
    } 
} 

Répondre

1

Vous pouvez essayer de remplacer la méthode WndProc dans votre formulaire. Puis en utilisant la position du curseur pour filtrer quand vous le faites et ne voulez pas gérer le message WM_MOUSEHOVER.

Quelque chose comme ceci:

public partial class MyForm: Form 
{ 
    private const int WM_MOUSEHOVER = 0x02A1; 

    protected override void WndProc(ref Message message) 
    { 
     Point mousePosition = this.PointToClient(Cursor.Position); 

     if ((message.Msg == WM_MOUSEHOVER) && (<useTheMousePositionToDoSomeFiltering>)) 
     { 
      return; 
     } 
     base.WndProc(ref message); 
    }  
} 

EDIT: Juste si quelque chose, il pourrait être préférable de créer un ListView personnalisé & TreeView (en dérivant simplement construit dans les .NET), puis outrepasser la routine WndProc dans les nouveaux contrôles pour toujours exclure WM_MOUSEHOVER. Le dépassement du WndProc du formulaire n'a pas aidé le

+0

. Le gestionnaire d'inactivité a été appelé plusieurs fois pendant que la souris est sur ListView. MAIS, en utilisant une classe dérivée ListView, remplacer le WndProc et retourner simplement sur WM_HOUSEMOVER a résolu le problème. Merci beaucoup, ParmesanCodice! – miasbeck

+0

@miasbeck heureux que cela a fonctionné. Gardez juste à l'esprit que le MouseHoverEvent ne déclenchera (très probablement) pas de classe dérivée. Donc, si vous utilisez des info-bulles sur cet événement, vous devrez les déplacer dans l'événement MouseMoveEvent – ParmesanCodice

Questions connexes