So deaktivieren Sie Hover-Nachrichten in .NET List / TreeViews?
-
22-09-2019 - |
Frage
Ich habe eine Windows Forms-Anwendung, die einige Application.Idle Handler verwendet den Status der Steuerelemente auf dem Formular zu ändern.
Nachdem ich ein Listview zu dem Formular hinzugefügt wurde mir klar, der Idle-Handlers viel zu oft aufgerufen werden, wenn der Mauszeiger über das Listview ist. Durch die Verwendung dass Spy ++ ich sehe, wenn der Mauszeiger über das Steuerelement (nicht bewegt) empfängt die Steuer WM_MOUSEHOVER-Nachrichten über einen über dem wiederum das Leerlaufereignis auslöst (nachdem die Nachrichtenwarteschlange leer ist). Das gleiche gilt für TreeView-Steuerelemente.
Ich frage mich, wie ich dieses Verhalten deaktivieren kann?
Ausführen von Code über die Eingabeaufforderung wird zeigen, was ich meine:
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) ;
}
}
Lösung
Sie könnten versuchen, und die WndProc Methode in Form außer Kraft setzen. Dann mit der Cursorposition Filter, wenn Sie tun und wollen nicht die WM_MOUSEHOVER Nachricht verarbeiten.
So etwas wie folgt aus:
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:. Nur wenn etwas, könnte es besser sein, eine benutzerdefinierte Listview & TreeView zu erstellen (indem man einfach den eingebauten .NET diejenigen Ableitung) und dann überschreiben die WndProc Routine in den neuen Kontrollen immer WM_MOUSEHOVER ausschließen