按下鼠标按钮时处理鼠标滚轮和键盘事件

时间:2013-06-02 21:10:10

标签: c# winforms mouseevent keyboard-events

我有一个自定义WinForms控件(派生自Control),我在其中覆盖了OnMouseXXX和OnKeyXXX事件。

我想处理轮子和/或键盘事件鼠标按钮(即OnMouseDown被触发,但OnMouseUp尚未被触发)。出于某种原因,在我释放鼠标按钮之前,我无法获得任何这些。

请就此事提出建议。使用interop / unsafe代码(如果需要)可以,使用计时器来读取键盘状态不是。

1 个答案:

答案 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;
        }

    }
}