2013-06-02 79 views
0

我有一個自定義的WinForms控件(派生自Control),其中我重寫了OnMouseXXX和OnKeyXXX事件。在按住鼠標按鈕的同時處理鼠標滾輪和鍵盤事件

我想處理車輪和/或鍵盤事件按下鼠標按鈕(即OnMouseDown已被觸發,但OnMouseUp未被觸發)。出於某種原因,直到我釋放鼠標按鈕時,我纔得到這些內容。

請告知此事。使用互操作/不安全的代碼(如果需要的話)可以,使用定時器讀取鍵盤狀態不是。

+1

沒有可識別的事件來處理鼠標滾輪事件,同時拖動/按下鼠標按鈕。 檢查此: http://stackoverflow.com/questions/4820095/can-the-mouse-wheel-be-used-while-dragging-dropping – sjkm

+0

看起來完全像我需要的,我會試試看,謝謝您! –

回答

1

而不是一個全局鉤子,你可以上一級並使用IMessageFilter()來代替。這將適用於只有您的應用程序專注於。不知道你需要在什麼級別工作...

public partial class MyUserControl : UserControl 
{ 

    private MyFilter filter; 

    public MyUserControl() 
    { 
     InitializeComponent(); 
     filter = new MyFilter(); 
     filter.LButtonScroll += new MyFilter.LBUTTONSCROLLDELEGATE(filter_LButtonScroll); 
     Application.AddMessageFilter(filter); 
    } 

    private void filter_LButtonScroll() 
    { 
     Console.WriteLine("WM_MOUSEWHEEL while LBUTTONDOWN"); 
    } 

    private class MyFilter : IMessageFilter 
    { 
     private bool LBUTTONDOWN = false; 
     private const int WM_LBUTTONDOWN = 0x201; 
     private const int WM_LBUTTONUP = 0x202; 
     private const int WM_MOUSEWHEEL = 0x20a; 

     public delegate void LBUTTONSCROLLDELEGATE(); 
     public event LBUTTONSCROLLDELEGATE LButtonScroll; 

     public bool PreFilterMessage(ref Message m) 
     { 
      switch (m.Msg) 
      { 
       case WM_LBUTTONDOWN: 
        LBUTTONDOWN = true; 
        break; 

       case WM_MOUSEWHEEL: 
        if (LBUTTONDOWN) 
        { 
         if (LButtonScroll != null) 
         { 
          LButtonScroll(); 
         } 
        } 
        break; 

       case WM_LBUTTONUP: 
        LBUTTONDOWN = false; 
        break; 
      } 
      return false; 
     } 

    } 
} 
+0

真棒,作品像魅力!雖然鉤子也可以,兩種方法都適用於我的情況,但我必須承認這一點更容易。謝謝! –

+0

這兩種方法都是大錘解決方案......我不認爲有一種更清潔的方式。 –

+0

我同意,但根據我的經驗,或多或少的非標準功能需要這種類型的代碼。這是可以接受的,但令人遺憾的是。另外,原來這種方法不適用於拖放,所以我也可能檢查鉤子以查看它們是否可以使用它。但這超出了最初的問題,所以這個答案被選中:) –