You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WinForm中点击button_InputComplete后如何隐藏TextBox内的闪烁光标并可恢复?

解决WinForm TextBox点击按钮后光标仍闪烁的问题

我之前也踩过这个坑,.NET自带的方法确实没法直接控制TextBox的插入光标,给你两个亲测有效的方案:

方案一:调用Windows API直接控制光标显示/隐藏

WinForm的TextBox底层是Windows原生控件,我们可以通过调用user32.dll的API直接操控它的插入光标:

首先在你的Form类里导入API:

using System.Runtime.InteropServices;

public partial class YourForm : Form
{
    // 导入API方法
    [DllImport("user32.dll")]
    private static extern bool HideCaret(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern bool ShowCaret(IntPtr hWnd);

    // 你的其他业务代码...
}

然后在按钮点击事件里隐藏光标:

private void button_InputComplete_Click(object sender, EventArgs e)
{
    // 隐藏TextBox的插入光标
    HideCaret(textBox1.Handle);

    // 这里写你的数据处理逻辑...

    // 如果之后需要恢复光标,调用下面的方法即可
    // ShowCaret(textBox1.Handle);
}

这个方法最直接,完全针对TextBox的插入光标,不会影响鼠标指针,也不需要移动焦点。

方案二:确保焦点真正转移到无光标控件

你之前尝试移焦点没成功,大概率是选的控件不对(比如Form本身无法显示焦点状态),换一个不会显示插入光标的控件来接收焦点就行:

比如让按钮自己获得焦点,或者用Label、Panel这类控件:

private void button_InputComplete_Click(object sender, EventArgs e)
{
    // 让按钮自己获得焦点,TextBox失去焦点后光标会自动消失
    button_InputComplete.Focus();

    // 或者用Label(前提是先把Label的TabStop属性设为true,不然无法获得焦点)
    // label1.TabStop = true;
    // label1.Focus();

    // 你的数据处理逻辑...

    // 恢复光标只需要让TextBox重新获得焦点
    // textBox1.Focus();
}

之前用this.Select()没效果,是因为Form本身不会显示焦点,焦点还是会停留在原来的TextBox上,所以一定要选一个能接收焦点的控件。

补充说明

  • Cursor.Hide()确实只针对鼠标指针,和TextBox的插入光标完全是两个概念,所以没用很正常。
  • 如果用方案二,对于Label这类默认不能获得焦点的控件,要先把TabStop属性设为true,不然Focus()方法不会生效。

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

火山引擎 最新活动