none
为什么我点击右键没有发生Click事件或MouseClick事件呢? RRS feed

  • 问题

  • 为什么我右键点击TextBox没有发生Click事件或MouseClick事件呢?我觉得好奇怪啊,哪位大侠知道,告知一声,谢谢了!!
    清爽无比
    2009年4月24日 12:26

答案

  • 那如果我想要在点击右键的时候发生某些事件的话,要怎么做呢?指教啊!!


    清爽无比
    对于TextBox,右键的点击仅仅只能触发MouseDown事件。不会触发MouseUp,MouseClick,Click事件。
    因为TextBox是一个比较特殊的控件,不像其他的控件,TextBox有很大一部分是交给操作系统来处理的;TextBox不是一个“纯”的C#写的控件。

    你可以看到,若是右键点击TextBox,会弹出系统默认的菜单。

    若是你的项目允许你创建一个TextBox的继承类,如下的代码可以截获鼠标右键点击事件:


    public class TextBoxEx : System.Windows.Forms.TextBox {
       private const int WM_RBUTTONDOWN = 0x204;
       private const int WM_RBUTTONUP = 0x205;

       protected override void WndProc(ref Message m) {
           switch (m.Msg) {
                case WM_RBUTTONUP:                 // 右键 Button Up了。。做什么呢?
                      this.OnClick(EventArgs.Empty);   // 触发Click事件; 你可以换成你喜欢的。。。
                      this.Focus();
                      return;   // 不把右键点击事件传递给底层类

                case WM_RBUTTONDOWN:   //右键 Button Down了。。做什么呢?
                      break;

           }

           base.WndProc(ref m);
       }
    }

    MCPD (Windows & Web)
    2009年4月24日 16:15
  • MouseDown
    知识改变命运,奋斗成就人生!
    2009年4月25日 1:05
    版主
  • 你直接使用MouseDown事件!
    周雪峰
    2009年4月25日 2:38
    版主
  • 实际上并不是Click在MouseUp之后,我的测试结果是这个顺序:
    MouseDown
    MouseClick
    MouseUp
    这是我的代码:
            private void textBox1_Click(object sender, EventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@Click";
            }

            private void textBox1_MouseUp(object sender, MouseEventArgs e)
            {
              
                this.label1.Text = this.label1.Text + "@MouseUp";
            }

            private void textBox1_MouseDown(object sender, MouseEventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@MouseDown";
            }
    输出结果是@MouseDown@Click@MouseUp
    另外,右键是可以触发MouseUp事件的!但是不会触发Click事件!

    周雪峰
    2009年4月25日 3:23
    版主
  • 不显示系统菜单可以设置 TextBox.ShortcutsEnabled = false
    知识改变命运,奋斗成就人生!
    2009年4月25日 3:56
    版主

全部回复

  • 你好,TextBox 不会引发右键的 Click 事件, 你可以使用其它的事件如 MouseDown 或 MouseUp 事件
    知识改变命运,奋斗成就人生!
    2009年4月24日 13:08
    版主
  • 你好!
         右键不触发这两个事件的
    周雪峰
    2009年4月24日 13:14
    版主
  • 那如果我想要在点击右键的时候发生某些事件的话,要怎么做呢?指教啊!!


    清爽无比
    2009年4月24日 15:39
  • 那如果我想要在点击右键的时候发生某些事件的话,要怎么做呢?指教啊!!


    清爽无比
    对于TextBox,右键的点击仅仅只能触发MouseDown事件。不会触发MouseUp,MouseClick,Click事件。
    因为TextBox是一个比较特殊的控件,不像其他的控件,TextBox有很大一部分是交给操作系统来处理的;TextBox不是一个“纯”的C#写的控件。

    你可以看到,若是右键点击TextBox,会弹出系统默认的菜单。

    若是你的项目允许你创建一个TextBox的继承类,如下的代码可以截获鼠标右键点击事件:


    public class TextBoxEx : System.Windows.Forms.TextBox {
       private const int WM_RBUTTONDOWN = 0x204;
       private const int WM_RBUTTONUP = 0x205;

       protected override void WndProc(ref Message m) {
           switch (m.Msg) {
                case WM_RBUTTONUP:                 // 右键 Button Up了。。做什么呢?
                      this.OnClick(EventArgs.Empty);   // 触发Click事件; 你可以换成你喜欢的。。。
                      this.Focus();
                      return;   // 不把右键点击事件传递给底层类

                case WM_RBUTTONDOWN:   //右键 Button Down了。。做什么呢?
                      break;

           }

           base.WndProc(ref m);
       }
    }

    MCPD (Windows & Web)
    2009年4月24日 16:15
  • MouseDown
    知识改变命运,奋斗成就人生!
    2009年4月25日 1:05
    版主
  • 你直接使用MouseDown事件!
    周雪峰
    2009年4月25日 2:38
    版主
  • 你直接使用MouseDown事件!
    周雪峰
    不可以简单的用MouseDown事件。。因为只有MouseDown不可以构成Click事件。

    一个Click事件必须是先MouseDown,然后再MouseUp结束,才被引发。

    比如,经常的,用户会右键点击某个控件,但是发现操作错误,不放开右键,把鼠标从该控件上移开,然后才松手。在这种情况下,只有MouseDown事件被引发,MouseUp事件和Click事件不会在该控件上引发。

    MCPD (Windows & Web)
    2009年4月25日 2:48
  • 实际上并不是Click在MouseUp之后,我的测试结果是这个顺序:
    MouseDown
    MouseClick
    MouseUp
    这是我的代码:
            private void textBox1_Click(object sender, EventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@Click";
            }

            private void textBox1_MouseUp(object sender, MouseEventArgs e)
            {
              
                this.label1.Text = this.label1.Text + "@MouseUp";
            }

            private void textBox1_MouseDown(object sender, MouseEventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@MouseDown";
            }
    输出结果是@MouseDown@Click@MouseUp
    另外,右键是可以触发MouseUp事件的!但是不会触发Click事件!

    周雪峰
    2009年4月25日 3:23
    版主
  • 实际上并不是Click在MouseUp之后,我的测试结果是这个顺序:
    MouseDown
    MouseClick
    MouseUp
    这是我的代码:
            private void textBox1_Click(object sender, EventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@Click";
            }

            private void textBox1_MouseUp(object sender, MouseEventArgs e)
            {
              
                this.label1.Text = this.label1.Text + "@MouseUp";
            }

            private void textBox1_MouseDown(object sender, MouseEventArgs e)
            {
               
                this.label1.Text = this.label1.Text + "@MouseDown";
            }
    输出结果是@MouseDown@Click@MouseUp
    另外,右键是可以触发MouseUp事件的!但是不会触发Click事件!

    周雪峰
    在.NET类库里面,MouseUp的确是在Click和MouseClick之后。

    在收到了WM_LMOUSEUP的消息之后,引发的事件顺序如下:
    Click
    MouseClick
    MouseUp

    我刚才测试了下,TextBox右键点击的确会引发MouseUp事件。这个是发生在点击弹出的菜单之后。

    我猜楼主是不希望那个菜单出现吧!

    有2个办法。一个是建立一个空的ContextMenuStrip控件,然后赋予给TextBox的ContextMenuStrip。这样右键点击就不会出现任何菜单了。

    还有一个我说的办法。直接截获WM_RMOUSEUP消息,不传递给底层的消息循环来处理。



    MCPD (Windows & Web)
    2009年4月25日 3:54
  • 不显示系统菜单可以设置 TextBox.ShortcutsEnabled = false
    知识改变命运,奋斗成就人生!
    2009年4月25日 3:56
    版主
  • 不显示系统菜单可以设置 TextBox.ShortcutsEnabled = false
    知识改变命运,奋斗成就人生!
    这个方法是最好的!
    MCPD (Windows & Web)
    2009年4月25日 3:57
  • 你好,我是肖小勇很高兴能认识你,我的 MSN:fanfan1918@hotmail.com ,我不会 VC.Net 刚才看到你关于 VC.Net 的回贴的确学习了不少,十分感谢
    知识改变命运,奋斗成就人生!
    2009年4月25日 4:04
    版主
  • 你好,也很高兴认识你!

    我msn已经加你了!

    MCPD (Windows & Web)
    2009年4月25日 4:05
  • 大家都认识了啊!太好了啊!
    有问题大家一起讨论啊!
    周雪峰
    2009年4月25日 4:23
    版主
  • 谢谢大家的指教啊,无论是“隐约有歌”,还是周版主与X.X.Y,都很厉害!真的觉得这个论坛很不错!!
    清爽无比
    2009年4月25日 14:09
  • 不用客气啊!
    大家互相交流嘛!
    希望你常常来这里和大家交流啊!
    周雪峰
    2009年4月25日 15:06
    版主