【问题标题】:Capture mouse touch the title bar of win form捕获鼠标触摸win表单的标题栏
【发布时间】:2013-03-10 16:19:31
【问题描述】:

我有一些技巧来捕捉鼠标触摸标题栏,但是当我将鼠标放在标题栏上时,例程会反复触发。这是例程

protected override void WndProc(ref Message m)
{
            if (m.Msg == 0xA0) // WM_NCMOUSEMOVE
            {
        listBox1.Items.Add("mouse move on title bar");
            }
            else if (m.Msg == 0x2A2) // WM_NCMOUSELEAVE
            {
        listBox1.Items.Add("mouse leave from title bar");            
            }

            base.WndProc(ref m);
}

谁能告诉我任何技巧,结果 WndProc 只在鼠标触摸标题栏时触发一次,而不是重复触发。谢谢

【问题讨论】:

  • 我不知道 Firing 事件只有一次,但您可以使用 flag 确保鼠标触摸标题栏时只执行一次所需的任务
  • 没有 WM_MOUSEENTER 事件吗? (我看到的唯一解决方案是它只触发一次,除了使用@nsconnector 所说的标志))

标签: c# winforms wndproc


【解决方案1】:

你在找这个吗?我正在使用标志控制向列表框添加项目。

private bool insideTitleBar = false;
private bool outsideTitleBar = false;

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0xA0) // WM_NCMOUSEMOVE
    {        
           if(!insideTitleBar)
           {
            listBox1.Items.Add("mouse move on title bar");
            insideTitleBar = true;
            outsideTitleBar = false;
           }
    } 
    else if (m.Msg == 0x2A2) // WM_NCMOUSELEAVE
    {
           if(!outsideTitleBar)
           {      
            listBox1.Items.Add("mouse leave from title bar");            
            outsideTitleBar = true;
            insideTitleBar = false;
           }
    }
    base.WndProc(ref m);
}

【讨论】:

  • 这件事可以用单个布尔类型变量来完成。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
相关资源
最近更新 更多