我想控制RichTextBox滚动,但在控件中找不到任何方法来执行此操作。
这样做的原因是,当鼠标光标位于RichTextBox控件上时,我希望鼠标滚轮滚动有效(它没有活动焦点:鼠标滚轮事件由表单处理)。
任何帮助表示赞赏!
我想控制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
anWM_MOUSEWHEEL
在application-level
. 我也使用Reflection
调用受保护的方法WndProc
来处理消息WM_MOUSEWHEEL
,你总是可以使用SendMessage
win32 函数来发送WM_MOUSEWHEEL
到richTextBox1
,但它需要在declaration
这里导入。由你决定。