解决 RichTextBox 选中文本时移动光标闪烁问题

找到了解决办法,小记一下。分享给有需要的人和以后再需要时的自己。

表现

大概就是,当鼠标在选中状态下的文本上移动时,会出现 箭头指针 和 输入指针 的交替闪烁。

文字描述不清楚,上动图!

解决 RichTextBox 选中文本时移动光标闪烁问题

解决方案

非常简单,只需要覆写一下 RichTextBox 控件。

RichTextBoxEx.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class RichTextBoxEx : RichTextBox
{
//相关网址
//SetCursor() https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setcursor
//WM_SETCURSOR https://learn.microsoft.com/zh-cn/windows/win32/menurc/wm-setcursor
//引入DLL,调用设置光标形状(SetCursor)函数
[DllImport("user32.dll")]
public static extern int SetCursor(IntPtr cursor);
private const int WM_SETCURSOR = 0x0020;

protected override void WndProc(ref Message m)
{
//修复选中文本移动光标闪烁问题。
if (m.Msg == WM_SETCURSOR)
{
SetCursor(Cursors.IBeam.Handle); //可以设置不同的光标(Cursors)
m.Result = new IntPtr(1);
return;
}
base.WndProc(ref m);
}
}

其它影响

  • 使用解决方案后会造成整个控件内的其它子控件同样无法切换指针
    • 例如:设置为非箭头指针后,拖动滚动条时的指针样式也会被修改成解决方案内设置的光标。
  • 其它暂未发现。