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




