ScrollBar 不在 Select() 上滚动

ScrollBar doesn't scroll on Select()

我使用 vScrollBar.Select(); 将焦点放在滚动条上 滚动条获得焦点但不随鼠标滚轮滚动

仅当鼠标光标位于滚动条上时才会滚动。

如何使滚动条在 Select() 之后滚动而不将光标放在滚动条上?

Environment: Windows 10, Windows forms, .NET 4.0

编辑

我注意到当我 "scroll" 用两根手指放在笔记本电脑触摸板上时,滚动条可以正确滚动,但不能用鼠标滚轮滚动。 问题是否可能是因为 Windows 10 mouse/touch 垫驱动程序?

要使用鼠标滚轮使用 Winforms 滚动条,请不要 Select() 滚动条本身,您必须 select 面板、图像或任何您设置为可滚动的内容。

我刚启动 Win10 并 运行,已确认。这是 Windows 10 新功能的副作用,该功能在“设置”>“设备”>“鼠标和触摸板”中配置。它被命名为"Scroll inactive windows when I hover over them",默认情况下是打开的。 This web page 提到了。

这实际上是一个非常 不错的功能,我个人肯定会继续使用它,很可能您的用户也会这样做。以前的 Windows 版本将鼠标滚轮消息发送到具有焦点的控件,这让许多习惯了鼠标在浏览器中的行为方式的用户感到困惑。请注意,滚动条有帮助,它会重绘缩略图以指示当您将鼠标移出滚动条时它不再处于活动状态。

修复它在技术上是可行的,您必须将消息重定向回滚动条。没什么特别漂亮的:

    public Form1() {
        InitializeComponent();
        panel1.MouseWheel += RedirectMouseWheel;
    }

    private bool redirectingWheel;

    private void RedirectMouseWheel(object sender, MouseEventArgs e) {
        if (this.ActiveControl != sender && !redirectingWheel) {
            redirectingWheel = true;
            SendMessage(this.ActiveControl.Handle, 0x020A, 
                new IntPtr(e.Delta << 16), IntPtr.Zero);
            redirectingWheel = false;
            var hmea = (HandledMouseEventArgs)e;
            hmea.Handled = true;
        }
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);

但是不要马上行动,您的用户最终会期待 Win10 的行为:)

不确定你们是否在新 Windows 10 中遇到鼠标问题。我有很多 pf 问题和大量研究,并更改了设置。尝试了所有推荐的。所有这些都在资源管理器中。我切换到 Mozilla Firefox,完全没有问题。一切都很完美。可能是您考虑的一个选项。如果您使用的是 Firefox,并且遇到问题,不知道那里。祝你好运!