开发者

How to disable Hover-Messages in .NET List/TreeViews?

开发者 https://www.devze.com 2022-12-24 10:44 出处:网络
I have a Windows Forms application that uses some Application.Idle handlers to change the status of controls on the form.

I have a Windows Forms application that uses some Application.Idle handlers to change the status of controls on the form.

After I added a ListView to the form I realized the Idle-Handlers get called way too often when the mouse cursor is over the ListView. By using Spy++ I saw that when the mouse cursor is over the control (not moving) the control receives WM_MOUSEHOVER messages over an over which in turn triggers the idle event 开发者_如何学运维(after the message queue is empty). The same holds for TreeView-Controls.

I wonder how I can disable this behavior?

Running this code from the command prompt will show what I mean:

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) ;
    }
}


You could try and override the WndProc method in your form. Then using the cursor position to filter when you do and do not want to handle the WM_MOUSEHOVER message.

Something like this:

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: Just though of something, it might be better to create a custom ListView & TreeView (by simply deriving the built in .NET ones) and then override the WndProc routine in the new controls to always exclude WM_MOUSEHOVER.

0

精彩评论

暂无评论...
验证码 换一张
取 消