C#Winforms在文本框上禁止鼠标单击事件

时间:2009-07-08 03:46:07

标签: c# winforms events

我在Winforms应用程序上有一个多行文本框,我希望能够在应用程序的某些状态下单击而不更改文本选择。

我仍然想订阅MouseDown(或Click)事件,我只是不希望文本选择对它作出反应。

我希望在MouseEventArgs上有一个Handled或Cancel属性,但遗憾的是,没有。

我可以听取选择更改事件并尝试在需要时重置它,但这感觉有点像黑客一样,因为我必须在选择更改事件之前记住当前选择。有谁有比这更好的建议?

3 个答案:

答案 0 :(得分:9)

您可以创建自己继承自System.Windows.Forms.Textbox的文本框,然后覆盖WndProc。

WndProc是接收来自操作系统,电源消息,输入等所有内容的消息的初始方法。该方法的名称是对Win32(和Win16)日的回归,其中两个主要功能之一是你实施的是“WndProc”或Windows程序。

通过这样做,您现在可以在将事件分派到基本实现之前拦截鼠标(或任何其他消息)的Windows消息。

在下面的示例中,我们不会将任何“向左”按钮向下,向上或双击传递给基本控件进行处理。

public partial class MyTextBox : TextBox
{
    int WM_LBUTTONDOWN = 0x0201; //513
    int WM_LBUTTONUP = 0x0202; //514
    int WM_LBUTTONDBLCLK = 0x0203; //515

    public MyTextBox()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {

        if (m.Msg == WM_LBUTTONDOWN || 
           m.Msg == WM_LBUTTONUP || 
           m.Msg == WM_LBUTTONDBLCLK // && Your State To Check
           )
        {
            //Dont dispatch message
            return;
        }

        //Dispatch as usual
        base.WndProc(ref m);
    }
}

只剩下要做的事情就是添加对状态的检查,以确定何时传递消息。

您可以找到要处理here的Windows消息列表。

答案 1 :(得分:1)

如何处理Enter事件并将焦点设置为此事件中的其他控件?尽管如此,仍然非常“类似黑客”。只需少量代码。

答案 2 :(得分:0)

将透明面板叠放在其上方。