必须先确认焦点在TextBox或RichTextBox且存在选中文本,否则SelectedText返回空字符串;遍历控件检查Focused属性或用ActiveControl判断类型后读取,RichTextBox选中内容为纯文本,保留格式需用SelectedRtf。

怎么用 SelectedText 获取焦点文本框的选中内容
直接读 SelectedText 前必须确认:当前有且仅有一个获得焦点的 TextBox 或 RichTextBox,且它确实有文字被选中。否则返回空字符串,不是 bug,是设计如此。
常见错误现象:SelectedText 总是空——大概率因为代码执行时焦点不在任何文本控件上,或者用户根本没做选择。
- 确保调用时机在用户操作后(比如按钮点击、
KeyDown事件),而非窗体加载时 - 不能跨控件“猜”哪个被选中,.NET 不维护全局选中文本状态
-
TextBoxBase派生类才支持SelectedText,普通Label或ComboBox的文本区域不适用
如何安全获取“当前活动文本框”的选中文字
没有内置的 “get active textbox” 方法,得自己找。最可靠的方式是遍历所有已知文本控件,检查 Focused 属性。
使用场景:快捷键(如 Ctrl+C)触发自定义复制逻辑,或工具栏按钮统一处理当前编辑区选中内容。
- 优先检查
ActiveControl是否为TextBox或RichTextBox类型,再读SelectedText - 别用
Control.FromHandle(Windows.Forms.Control.ActiveForm?.Focus())——句柄可能为空,且类型不可靠 - 如果用了多文档界面(MDI)或 TabControl,注意
ActiveControl返回的是子容器里的控件,需递归查找
var focused = this.ActiveControl;
if (focused is TextBox tb) {
string sel = tb.SelectedText; // 安全
}
SelectedText 在 RichTextBox 和 TextBox 中的行为差异
两者都支持 SelectedText,但底层机制不同: TextBox 是纯字符串,RichTextBox 还带格式。这会影响你后续怎么用这段文字。
性能 / 兼容性影响:读 SelectedText 本身开销极小,但若紧接着对 RichTextBox 调用 SelectAll() 或修改 Rtf 属性,可能触发重绘延迟。
-
TextBox.SelectedText返回纯文本,不含换行符以外的控制字符 -
RichTextBox.SelectedText只返回纯文本;要保留格式得用SelectedRtf或SelectedText+ 手动提取样式 - 在
ReadOnly模式下,SelectedText仍可读,但设置会抛InvalidOperationException
为什么有时 SelectedText 看似“失效”
典型表现:明明看到高亮了文字,SelectedText 却是空。这不是 .NET 的问题,而是 Windows 消息循环或焦点管理的副作用。
容易踩的坑:
- 在
MouseDown或PreviewKeyDown里立刻读——此时系统还没完成选中逻辑,得延后一帧(用BeginInvoke) - 文本框嵌套在
Panel或GroupBox中,且父容器拦截了鼠标事件,导致焦点未真正落到文本框 - 用了自定义输入法(尤其中文),某些组合键会清空选区再输入,造成“刚选完就没了”的错觉
复杂点在于:焦点、选择、输入法、消息队列四者耦合紧密,单靠查文档很难覆盖所有边界情况。调试时优先用 Debug.WriteLine($"Focused: {ActiveControl?.Name}, SelLen: {tb?.SelectionLength}") 实时验证状态。


















