代码之家  ›  专栏  ›  技术社区  ›  johnc

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

  •  0
  • johnc  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 15 年前
        1
  •  9
  •   Darien Ford    15 年前

    您可以从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消息列表 here .

        2
  •  1
  •   marcc    15 年前

    Enter 事件,并在此事件中将焦点设置为其他控件?不过还是很像黑客,只是代码少了点。

        3
  •  0
  •   Joel Coehoorn    15 年前

    将透明面板分层放置在其顶部。