C# 滚动文本框
我想控制RichTextBox滚动,但在控件中找不到执行此操作的任何方法 这样做的原因是,我希望当鼠标光标位于RichTextBox控件上时,鼠标滚轮滚动有效(它没有活动焦点:鼠标滚轮事件由窗体处理)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
感谢您的帮助 使用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方法检查光标是否悬停。