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) ;
    }
}
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top