代码之家  ›  专栏  ›  技术社区  ›  JYelton Melchior Blausand

如何实现对WinForms的双击?

  •  8
  • JYelton Melchior Blausand  · 技术社区  · 14 年前

    This question 似乎指向了Windows事件的存在,双击鼠标右键。然而,如何在C Windows窗体中实现它还不太清楚。

    实现双击按钮等控件的最佳方法是什么?

    (我想我必须使用 MouseDown 并跟踪点击之间的时间间隔。有更好的方法吗?)

    4 回复  |  直到 11 年前
        1
  •  5
  •   Hans Olsson    14 年前

    重写 WndProc 功能和倾听 WM_RBUTTONDBLCLK ,如图所示 pinvoke 页面是 0x0206 .

    那个pinvoke页面还提供了一些C示例代码,用于说明如何操作。

    每当您看到关于Windows消息和/或Windows API的内容,并且希望在C中使用它时,pinvoke站点是一个很好的开始查找的地方。

        2
  •  3
  •   Reed Copsey    14 年前

    重写 Control.WndProc 和处理 WM_RBUTTONDBLCLK 手动发送消息。

        3
  •  2
  •   IamMan    11 年前

    mouseEventArgs包含指示已单击wich按钮的属性“button”。所以你可以简单地检查一下:

        private void MouseDoubleClickEventHandler(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DoSomthing();
            } else if (e.Button == MouseButtons.Right)
            {
                DoSomethingElse();
            }
        }
    
        4
  •  0
  •   JYelton Melchior Blausand    14 年前

    我可以通过从一个按钮继承并重写 WndProc 正如Ho1和Reed建议的那样。这是继承的按钮:

    public class RButton : Button
    {
        public delegate void MouseDoubleRightClick(object sender, MouseEventArgs e);
        public event MouseDoubleRightClick DoubleRightClick;
        protected override void WndProc(ref Message m)
        {
            const Int32 WM_RBUTTONDBLCLK = 0x0206;
            if (m.Msg == WM_RBUTTONDBLCLK)
                DoubleRightClick(this, null);
            base.WndProc(ref m);
        }
    }
    

    我用程序将按钮添加到表单中,并订阅了新的双击事件。我不知道如何准确地生成适当的 MouseEventArgs 但因为这只是一个测试用例,所以并不重要。