C# 滚动文本框

C# 滚动文本框,c#,winforms,scroll,richtextbox,C#,Winforms,Scroll,Richtextbox,我想控制RichTextBox滚动,但在控件中找不到执行此操作的任何方法 这样做的原因是,我希望当鼠标光标位于RichTextBox控件上时,鼠标滚轮滚动有效(它没有活动焦点:鼠标滚轮事件由窗体处理) 感谢您的帮助 使用win32有点简单。给你: //must add using System.Reflection public partial class Form1 : Form, IMessageFilter { bool hovered; MethodInfo wndPr

我想控制RichTextBox滚动,但在控件中找不到执行此操作的任何方法

这样做的原因是,我希望当鼠标光标位于RichTextBox控件上时,鼠标滚轮滚动有效(它没有活动焦点:鼠标滚轮事件由窗体处理)


感谢您的帮助

使用win32有点简单。给你:

//must add using System.Reflection
public partial class Form1 : Form, IMessageFilter 
{
    bool hovered;
    MethodInfo wndProc;

    public Form1() 
    {
       InitializeComponent();
       Application.AddMessageFilter(this);
       richTextBox1.MouseEnter += (s, e) => { hovered = true; };
       richTextBox1.MouseLeave += (s, e) => { hovered = false; };
       wndProc = typeof(Control).GetMethod("WndProc", BindingFlags.NonPublic | 
                                                      BindingFlags.Instance);
    }

    public bool PreFilterMessage(ref Message m) 
    {
        if (m.Msg == 0x20a && hovered) //WM_MOUSEWHEEL = 0x20a
        {
           Message msg = Message.Create(richTextBox1.Handle, m.Msg, m.WParam, m.LParam);
           wndProc.Invoke(richTextBox1, new object[] { msg });
        }
        return false;
    }
}

注意:我使用
IMessageFilter
应用程序级别捕获
WM_鼠标滚轮
消息。我还使用
Reflection
调用受保护的方法
WndProc
来处理消息
WM_MOUSEWHEEL
,您始终可以使用
SendMessage
win32函数将
WM_MOUSEWHEEL
发送到
richTextBox1
,但它需要
声明
在此处导入。这取决于您。

旁注:在系统范围内执行此操作的Windows应用程序是“KatMouse”。很遗憾,我不知道如何在您的程序中自己执行此操作。您的可能重复项可以在将鼠标悬停在RichTextBox上时将其设置为选定控件。重复的问题会导致一个链接。我更喜欢King King answer立即给出解决方案。谢谢,效果很好!我刚刚使用richTextBox1.Contains方法检查光标是否悬停。