如何将具有正确属性的 MouseEventArgs 传递给事件处理程序?

How to pass a MouseEventArgs with correct properties into event handlers?

我有一个程序,其表单内有一个 FlowLayoutPanel。我正在对 FlowLayoutPanelMouseMove 事件进行编码,一切正常;除了当光标在其滚动条上移动时它不会触发 MouseMove 事件。

我在网上搜索并找到了以下方法,该方法使用 FlowLayoutPanel 的派生 class,然后覆盖其 WndProc方法:

    class FlowLayoutPanelEx : FlowLayoutPanel
    {
        const int WM_NCMOUSEMOVE = 0x00A0;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCMOUSEMOVE)
            {
                base.OnMouseMove(null);
            }

            base.WndProc(ref m);
        }
    }

我在提出(或调用)base.OnMouseMove() 时遇到问题。它需要一个 MouseEventArgs 对象作为参数传入。我需要传递正确的 MouseEventArgs 因为我的事件处理程序依赖于它,但我不知道如何 set/where 获得正确的属性(按钮、X、Y、等)传递正确的 MouseMoveEvent.

任何帮助将不胜感激。

您可以通过拦截 WM_NCMOUSEMOVE 消息来检测鼠标在滚动条上的移动。像这样:

protected override void WndProc(ref Message m) {
    if (m.Msg == 0xA0) {  // WM_NCMOUSEMOVE.
        var pos = this.PointToClient(new Point(m.LParam.ToInt32()));
        var evt = new MouseEventArgs(Control.MouseButtons, 0, pos.X, pos.Y, 0);
        OnMouseMove(evt);
    }
    base.WndProc(ref m);
}