You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止RichTextBox控件中鼠标滚轮滚动延迟的问题

解决RichTextBox滚轮停止后仍持续滚动的问题

当将RichTextBox用作类控制台的只读输出框(黑色背景、窗体宽度)时,会遇到一个问题:使用鼠标滚轮滚动后,即便停止转动滚轮,控件仍会持续滚动一小段时间,且该控件没有直接调整此行为的属性。

解决方案

重写控件的WndProc()方法,拦截并自定义处理WM_MOUSEWHEEL事件即可解决,注意需要通过位运算测试IntPtr的符号来判断滚动方向。

以下是具体的实现代码:

public class CustomRichTextBox : RichTextBox
{
    private const int WM_MOUSEWHEEL = 0x020A;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEWHEEL)
        {
            // 通过位运算提取滚轮滚动增量
            int delta = (int)m.WParam >> 16;
            // 自定义滚动步长,正数对应向上滚,负数对应向下滚
            int scrollStep = delta > 0 ? -10 : 10;
            
            // 直接调整选中位置并滚动到该位置,替代默认惯性滚动
            this.SelectionStart = Math.Clamp(this.SelectionStart + scrollStep, 0, this.TextLength);
            this.ScrollToCaret();
            return; // 阻止默认消息处理,取消惯性滚动
        }
        base.WndProc(ref m);
    }
}

这段代码通过拦截鼠标滚轮消息,手动控制滚动位置,绕过了系统默认的惯性滚动逻辑,从而实现滚轮停止转动后,控件滚动立即停止的效果。

内容的提问来源于stack exchange,提问作者Andrea Bardelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:58:12