我有一個自定義的WinForms控件(派生自Control),其中我重寫了OnMouseXXX和OnKeyXXX事件。在按住鼠標按鈕的同時處理鼠標滾輪和鍵盤事件
我想處理車輪和/或鍵盤事件而按下鼠標按鈕(即OnMouseDown已被觸發,但OnMouseUp未被觸發)。出於某種原因,直到我釋放鼠標按鈕時,我纔得到這些內容。
請告知此事。使用互操作/不安全的代碼(如果需要的話)可以,使用定時器讀取鍵盤狀態不是。
我有一個自定義的WinForms控件(派生自Control),其中我重寫了OnMouseXXX和OnKeyXXX事件。在按住鼠標按鈕的同時處理鼠標滾輪和鍵盤事件
我想處理車輪和/或鍵盤事件而按下鼠標按鈕(即OnMouseDown已被觸發,但OnMouseUp未被觸發)。出於某種原因,直到我釋放鼠標按鈕時,我纔得到這些內容。
請告知此事。使用互操作/不安全的代碼(如果需要的話)可以,使用定時器讀取鍵盤狀態不是。
而不是一個全局鉤子,你可以上一級並使用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;
}
}
}
真棒,作品像魅力!雖然鉤子也可以,兩種方法都適用於我的情況,但我必須承認這一點更容易。謝謝! –
這兩種方法都是大錘解決方案......我不認爲有一種更清潔的方式。 –
我同意,但根據我的經驗,或多或少的非標準功能需要這種類型的代碼。這是可以接受的,但令人遺憾的是。另外,原來這種方法不適用於拖放,所以我也可能檢查鉤子以查看它們是否可以使用它。但這超出了最初的問題,所以這個答案被選中:) –
沒有可識別的事件來處理鼠標滾輪事件,同時拖動/按下鼠標按鈕。 檢查此: http://stackoverflow.com/questions/4820095/can-the-mouse-wheel-be-used-while-dragging-dropping – sjkm
看起來完全像我需要的,我會試試看,謝謝您! –