滚动一个RichTextBox

4
我想控制一个RichTextBox的滚动,但找不到在控件中执行此操作的任何方法。
这样做的原因是当鼠标光标位于RichTextBox控件上时(它没有活动焦点:鼠标滚轮事件由表单处理),我希望鼠标滚轮滚动有效。
感谢您的帮助!

附注:一个在整个系统范围内实现此功能的Windows应用程序是“KatMouse”。很遗憾,我不知道如何在你自己的程序中实现这一点。 - Ray
可能是Detecting mousewheel over non-focused window?的重复问题。 - JMK
当鼠标悬停在RichTextBox上时,您可以将其设置为选定控件。 - Max
1
重复的问题会导致链接。我更喜欢King King的回答,直接给出解决方案。 - Martin Delille
1个回答

2

使用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_MOUSEWHEEL 消息。我还使用了 Reflection 来调用受保护的方法 WndProc 处理 WM_MOUSEWHEEL 消息,但你也可以始终使用 SendMessage Win32 函数将 WM_MOUSEWHEEL 发送到 richTextBox1,但这需要在此处进行 声明 导入。这取决于你。


谢谢,它工作得很好!我刚刚使用了richTextBox1.Contains方法来检查光标是否悬停。 - Martin Delille

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接