ScrollBar不会在Select()上滚动

Mir*_*pov 4 scrollbar .net-4.0 winforms windows-10

我将焦点放在一个滚动条上vScrollBar.Select(); 滚动条变得聚焦但它不会滚动鼠标滚轮.

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

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

环境:Windows 10,Windows窗体,.NET 4.0

编辑

当我用笔记本电脑触摸板上的两个手指"滚动"时,我注意到滚动条正确滚动,但不是鼠标滚轮.问题可能是因为Windows 10鼠标/触摸板驱动程序?

Han*_*ant 8

我刚刚启动并运行Win10,确认.这是在设置>设备>鼠标和触摸板中配置的新Windows 10功能的副作用.它被命名为"当我将鼠标悬停在它们上时滚动非活动窗口",它默认打开. 这个网页提到了它.

这实际上是一个非常好的功能,我个人肯定会保持它,很可能你的用户也会这样.以前的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);
Run Code Online (Sandbox Code Playgroud)

但是不要跳枪,你的用户很容易期待Win10的行为,最终:)