【问题标题】:Handling mouse wheel and keyboard events while a mouse button is pressed在按下鼠标按钮时处理鼠标滚轮和键盘事件
【发布时间】:2016-05-12 00:12:06
【问题描述】:

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

我想在按下鼠标按钮时处理滚轮和/或键盘事件(即 OnMouseDown 已触发,但 OnMouseUp 尚未触发)。出于某种原因,在我松开鼠标按钮之前,我无法获得其中任何一个。

请就此事提出建议。使用互操作/不安全代码(如果需要)可以,但不能使用计时器读取键盘状态。

【问题讨论】:

  • 在拖动/按下鼠标按钮时没有可识别的事件来处理鼠标滚轮事件。检查这个:stackoverflow.com/questions/4820095/…
  • 看起来和我需要的一模一样,我试试看,谢谢!

标签: c# winforms mouseevent keyboard-events


【解决方案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;
        }

    }
}

【讨论】:

  • 太棒了,就像一个魅力!虽然钩子也可以,并且两种方法都适用于我的情况,但我必须承认这种方法更容易。谢谢!
  • 这两种方法都是大锤解决方案...不过我认为没有更清洁的方法。
  • 我同意,但根据我的经验,或多或少的非标准功能需要这种代码。这是可以接受的,但令人遗憾。此外,事实证明这种方法不适用于拖放操作,因此我也可能会检查挂钩以查看它们是否可以使用。但这超出了最初的问题,因此选择了这个答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多