none
请问要如何强制鼠标移动事件总是在winform里触发? RRS feed

  • 问题

  • 在Form中订阅MouseMove事件,当鼠标移动进控件之后,窗体就不再相应鼠标移动事件。但是如果该控件不响应鼠标移动事件,那么就会丧失鼠标的具体位置。

    请问有没有什么办法能够让Form总是能够监听鼠标位置呢?

    注:消息循环是先走控件后走Form,重写WndProc不管用。

    2010年3月30日 1:03

全部回复

  •    private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                label1 .Text ="x坐标:" + e.X.ToString () ; 
                label2.Text = "y坐标:" + e.Y.ToString(); 
    
            }
    
            private void panel1_MouseEnter(object sender, EventArgs e)
            {
                this.Capture = true;
            }
    
            private void Form1_MouseLeave(object sender, EventArgs e)
            {
                this.Capture = false;
            }
    

    努力+方法=成功
    2010年3月30日 1:25
  • 你好!

    这种情况是正常的。最简单的方式就是你为窗体 的每个控件都注册 MouseMove 事件。

    public Form1()
    {
        InitializeComponent();
    
    
        List<Control> controls = new List<Control>();
    
        controls.Add(this);
        // 获取窗体中所有的控件。
        this.GetChildControls(controls, this);
    
        foreach (Control c in controls)
        {
            // 为窗体中的每个控件注册 MouseMove 事件。
            c.MouseMove += new MouseEventHandler(delegate(object sender, MouseEventArgs e)
            {
                Control control = sender as Control;
                Point p = control.PointToScreen(e.Location);
                this.Text = string.Format("X:{0} Y:{1}",  p.X, p.Y);
            });
        }
    }
    
    private void GetChildControls(List<Control> list, Control parent)
    {
        foreach (Control c in parent.Controls)
        {
            list.Add(c);
            this.GetChildControls(list, c);
        }
    }

    还可以使用一个 timer 每隔一段时间去获取鼠标的屏幕坐标。

    如何获取参考:http://blog.csdn.net/sabty/archive/2009/11/02/4756464.aspx


    知识改变命运,奋斗成就人生!
    2010年3月30日 1:42
    版主
  • 我用的是第三方控件,那控件里夹了一个控件,这个子控件没有订阅MouseMove,我也获取不到这个子控件,所以我现在无法在这个子控件里获取鼠标位置。版主的办法我用不了(能用我也不可能来发帖)。
    2010年3月30日 1:53
  • 使用 timer 嘛,上面不是提到了吗?另外使得反射应该可能获取到你说的那个控件。
    知识改变命运,奋斗成就人生!
    2010年3月30日 2:20
    版主
  • 你好!

         如果你想获取坐,可以尝试通过Cursor.Position属性来获取,获得的是屏幕坐标,使用的时候可以根据需要转换!

         希望对你有帮助啊!


    周雪峰
    2010年4月23日 11:31
    版主