Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Winforms抑制文本框上的鼠标单击事件_C#_Winforms_Events - Fatal编程技术网

C#Winforms抑制文本框上的鼠标单击事件

C#Winforms抑制文本框上的鼠标单击事件,c#,winforms,events,C#,Winforms,Events,我在Winforms应用程序上有一个多行文本框,我希望能够在应用程序的某些状态下单击该文本框,而无需更改文本选择 我仍然希望订阅MouseDown(或Click)事件,我只是不希望文本选择对其作出反应 我希望在MouseEventArgs上有一个被处理或取消的财产,但遗憾的是,没有 我可以收听选择更改事件,并在需要时尝试重置它,但这感觉有点像黑客,因为我必须在选择更改事件之前记住当前选择。有人有比这更好的建议吗?在其上方放置一个透明面板。如何处理Enter事件并在此事件中将焦点设置为其他控件?不

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

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

我希望在MouseEventArgs上有一个被处理或取消的财产,但遗憾的是,没有


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

在其上方放置一个透明面板。

如何处理
Enter
事件并在此事件中将焦点设置为其他控件?不过还是相当“黑客式”,只需更少的代码。

您可以从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);
    }
}
唯一要做的就是添加状态检查,以确定何时传递消息


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

我也考虑过,但它同样让人感觉很笨拙。可能比回滚选择更改事件更简单,尽管透明的背景色似乎不起作用。我可能会错过一些东西,虽然它很难看,但它似乎是有效的,我只需要在关注一个虚拟的空标签后,将我的功能移到enter事件。不过,我还不会接受这个答案,除非我没有得到更好的建议,谢谢,实际上没有,因为我需要鼠标事件参数。该死的,我不怪你还没接受。我正在看这一个,看看是否有人有更好的想法:)非常好,谢谢,我知道我必须钻到.Net堆栈下面,但仍然没有得到鼠标事件参数,但我喜欢这个解决方案,可以解决这个问题。你可以在文本框中添加一个额外的事件,在其中传递鼠标事件参数,并在表单中使用相同的事件处理程序。这样可以绕过默认的鼠标处理实现。