2010-05-05 53 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屬性,它允許表單接收事件,但我不知道任何類似的鼠標事件。