我有一个自定义WinForms控件(派生自Control),我在其中覆盖了OnMouseXXX和OnKeyXXX事件。
我想处理轮子和/或键盘事件按鼠标按钮(即OnMouseDown被触发,但OnMouseUp尚未被触发)。出于某种原因,在我释放鼠标按钮之前,我无法获得任何这些。
请就此事提出建议。使用interop / unsafe代码(如果需要)可以,使用计时器来读取键盘状态不是。
答案 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;
}
}
}