代码之家  ›  专栏  ›  技术社区  ›  miasbeck

如何禁用.net list/treeviews中的悬停消息?

  •  0
  • miasbeck  · 技术社区  · 16 年前

    我有一个Windows窗体应用程序,它使用一些应用程序。空闲处理程序来更改窗体上控件的状态。

    在我向表单中添加了一个listview之后,我意识到当鼠标光标位于listview上时,空闲处理程序被调用的频率太高了。通过使用spy++我看到,当鼠标光标在控件上(不移动)时,控件接收wm_mousehover消息,然后触发空闲事件(在消息队列为空之后)。 TreeView控件也是如此。

    我想知道我怎样才能阻止这种行为?

    从命令提示符运行此代码将显示我的意思:

    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) ;
        }
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   ParmesanCodice    16 年前

    您可以尝试重写表单中的wndproc方法。然后使用光标位置进行筛选,以确定是否需要处理wm_mousehover消息。

    像这样的:

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

    编辑:尽管有些问题,但最好创建一个自定义的ListView&TreeView(通过简单地派生内置的.NET视图),然后重写新控件中的WndProc例程,以始终排除WM_Mousehover。

    推荐文章