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

joh*_*hnc 0 c# events winforms

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

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

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

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

Dar*_*ord 9

您可以创建自己的Textbox继承自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

您可以在此处找到要处理的Windows消息列表.