You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何让聚焦的RichTextBox光标(Caret/Ibeam)无限闪烁?

嘿,这个问题我之前也帮人解决过——Windows原生的文本控件(包括写字板用的)确实默认会让光标闪个5、6次就停在实线状态,但像Notepad++、VS这类编辑器都是自己改了这个行为。要让你的RichTextBox实现无限闪烁,其实靠Win32 API就能搞定,下面是具体步骤:

实现RichTextBox光标无限闪烁的方案

1. 先搞懂原生控件的默认逻辑

Windows的EDIT和RICHEDIT控件有个系统预设的「光标闪烁超时」机制:大概闪5-7次后,就会自动停止闪烁,变成固定的实线光标。这是系统级的默认行为,但我们可以通过API覆盖这个规则。

2. 用Win32 API修改闪烁行为

核心思路是给RichTextBox发送EM_SETBLINKTIME消息,手动指定光标闪烁的周期,这样就能绕过系统的超时限制。

C# 代码实现

我们可以自定义一个继承自RichTextBox的控件,在控件创建时自动应用这个设置:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class BlinkingRichTextBox : RichTextBox
{
    // Win32消息常量
    private const int EM_SETBLINKTIME = 0x010D;

    // 导入SendMessage API
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        
        // 设置闪烁周期为500毫秒(每秒闪1次),关键是手动设置后会取消超时
        // 你可以根据需求调整这个数值,比如300就是更快的闪烁
        SendMessage(this.Handle, EM_SETBLINKTIME, IntPtr.Zero, (IntPtr)500);
        
        // 确保控件获得焦点时光标立即开始闪烁
        this.Focus();
    }
}

为什么这招管用?

系统的光标超时逻辑只在使用默认闪烁时间时才会触发。当我们手动通过EM_SETBLINKTIME指定闪烁周期后,系统会取消超时机制,让光标一直保持闪烁状态——这就是Notepad++、VS这类编辑器的实现思路。

3. 额外注意点

  • 如果控件失去焦点后重新获得,闪烁会自动恢复,不需要额外处理;
  • 这个方法同样适用于普通的TextBox控件,只需要把继承的类改成TextBox即可;
  • 闪烁周期的数值越小,光标闪烁得越快,你可以根据自己的需求调整。

验证效果

把项目里原来的RichTextBox替换成这个自定义的BlinkingRichTextBox,运行程序后,光标就会一直持续闪烁,再也不会变成实线了。


内容的提问来源于stack exchange,提问作者CJF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:34