WinForms如何禁用双击并接受所有鼠标单击?

7

如何让所有点击事件都传递给事件处理程序?我发现如果你点击得太快,它会认为你是双击而不会将点击发送到事件处理程序。是否有一种方法可以获得所有的点击事件?


2
请改用mousedown事件。 - Russell Troywest
@RussellTroywest 我认为MouseClick事件会更好,因为它具有更好的触发顺序。 - Michał Powaga
1
@Michael:根据MSDN的说法,“两次单击事件如果在时间上足够接近(由用户操作系统的鼠标设置决定),将会生成一个MouseDoubleClick事件,而不是第二个MouseClick事件。”这就是High所看到的情况。 - Russell Troywest
是的,有方法可以关闭双击事件,但您需要记录您正在使用的特定控件。 - Hans Passant
3个回答

9
不太确定为什么这个问题会得到悬赏,已经接受的答案应该已经非常接近解决方案了。除了您应该使用 MouseUp 而不是 MouseDown,因为用户通常希望在释放按钮时生效点击操作。这提供了撤销“哎呀,我不是想点击它,请移动鼠标以使其被忽略”的选项。
尽管如此,对于内置的 Winforms 控件(如 PictureBox),可以使用 Control.SetStyle() 方法进行配置。将下面显示的代码粘贴到项目中添加一个新类。编译。从工具箱的顶部拖放新控件:
using System;
using System.Windows.Forms;

class MyPictureBox : PictureBox {
    public MyPictureBox() {
        this.SetStyle(ControlStyles.StandardDoubleClick, false);
    }
}

请注意,这种方法不适用于包装现有本机 Windows 控件的 .NET 类,如 TextBox、ListBox、TreeView 等。其底层配置是WNDCLASSEX.style 成员中的 CS_DBLCLKS 样式标志。设置该样式标志的代码嵌入在Windows中,无法更改。您需要进行其他类型的操作才能将双击事件转换为单击事件。通过重写 WndProc() 方法可以实现此目的,以下是一个 TextBox 的示例:

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void WndProc(ref Message m) {
        // Change WM_LBUTTONDBLCLK to WM_LBUTTONCLICK
        if (m.Msg == 0x203) m.Msg = 0x201;
        base.WndProc(ref m);
    }
}

如果你想对其他控件进行此操作,只需更改类名即可。通过挪用Winforms使其按照你的意愿工作不需要太多代码,只需要Petzold :)


3

您希望使用控件的MouseDown事件而不是Click事件。每次鼠标在该控件上“按下”时,都会调用MouseDown。如果系统认为这是双击,则可能不会调用Click。相反,将引发DoubleClick事件。


-2

我认为你想要计算所有的点击次数。 如果你想要计算点击次数,那么设置一个计数器变量并在点击事件中增加它。 也许这会对你有所帮助....


自己动手试试,快速点击10次。你会得到一个小于10的数字。我想要这10个点击的数字。 - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接