2010-05-05 28 views
1

我已经重写了UserControl级别的WndProc来检测MouseDown,MouseUp和MouseMove到在该UserControl中添加的任何控件。C#覆盖控制级别的WndProc来检测

protected override void WndProc(ref Message m) 
    { 
     Point mouseLoc = new Point(); 

     switch (m.Msg) 
     { 
      case WM_LBUTTONDOWN: 
       System.Diagnostics.Debug.WriteLine("mouse down"); 
       //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X, mouseLoc.Y, 0)); 

       break; 
      case WM_LBUTTONUP: 
       System.Diagnostics.Debug.WriteLine("mouse up"); 
       //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0)); 

       break; 
      case WM_MOUSEMOVE: 
       int lParam = m.LParam.ToInt32(); 

       //mouseLoc.X = lParam & 0xFFFF; 
       //mouseLoc.Y = (int)(lParam & 0xFFFF0000 >> 16); 

       mouseLoc.X = (Int16)m.LParam; 
       mouseLoc.Y = (Int16)((int)m.LParam >> 16); 

       System.Diagnostics.Debug.WriteLine("mouse move: " + mouseLoc.X + ", " + mouseLoc.Y); 

       //this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1, mouseLoc.X,mouseLoc.Y, 0)); 
       break; 
     } 

     base.WndProc(ref m); 
    } 

当鼠标指针在用户控件,但是当鼠标指针在其他控件(我的用户里面)这是行不通的MouseMove,向下和向上的工作。

我做错了什么?

目前正在开发一个轻弹和滚动控制。

+0

我试图在输出窗口中获取m.Msg,而鼠标指针位于其他控件上,并显示528和33.您认为这是什么? – jaysonragasa 2010-05-05 06:34:35

回答

1

这就是Windows的工作原理 - winforms中的每个控件都是一个窗口,并且鼠标消息会转到它们结束的窗口。如果你需要从其他窗口获得鼠标输入,你需要以某种方式配合它们。说了这么多,如果你想要的只是一个轻弹和滚动控制,你应该考虑看看WM_GESTURE API--这就是他们的目的,他们将允许你实现轻弹和滚动,没有任何合作从你的孩子的窗户。

+0

是否可以在不使用WM_GESTURE的情况下实现这一点? – jaysonragasa 2010-05-05 08:44:11

+0

当然,这真的很难。 – Stewart 2010-05-05 08:54:34

0

你没有做任何“错误”的事情,但Windows只是简单地将消息发送给正确的控件。它不会将消息发送到所有封闭控件。

对于关键事件,有Form.KeyPreview属性,它允许表单接收事件,但我不知道任何类似的鼠标事件。