如何用UI Automation库获取选中内容并替换指定文本(.NET7 WinForms)
解决方案
要实现仅替换焦点控件的选中文本,你可以利用TextPatternRange的ReplaceText方法,这是UI Automation专门针对文本区域编辑的原生API,无需依赖剪贴板或复杂WinAPI。
修改后的代码示例
private void ReplaceSelectedText(string replacementText) { try { var focusedElement = AutomationElement.FocusedElement; if (focusedElement == null) return; if (focusedElement.TryGetCurrentPattern(TextPattern.Pattern, out var patternObj)) { var textPattern = (TextPattern)patternObj; var selectedRanges = textPattern.GetSelection(); // 遍历所有选中区域,兼容富文本控件的多段选中场景 foreach (var range in selectedRanges) { // 替换当前选中区域的文本 range.ReplaceText(replacementText); } } // 兼容极少数仅支持ValuePattern的老旧控件,此逻辑会替换全部文本,按需启用 // else if (focusedElement.TryGetCurrentPattern(ValuePattern.Pattern, out var valuePatternObj)) // { // var valuePattern = (ValuePattern)valuePatternObj; // valuePattern.SetValue(replacementText); // } } catch (Exception ex) { Console.WriteLine($"替换失败: {ex.Message}\n{ex.StackTrace}"); } }
关键说明
- 核心逻辑:
TextPatternRange.ReplaceText直接对选中的文本区域进行修改,支持绝大多数标准文本控件(包括记事本、浏览器输入框、Office系列控件等)。 - 多选中区域处理:遍历
GetSelection()返回的所有范围,覆盖富文本类控件的多段选中场景。 - 兼容性处理:针对极少数不支持TextPattern的老旧控件,可选择回退到全量文本替换,但这不符合"仅替换选中内容"的需求,可根据实际场景决定是否启用。
使用方式
调用时传入目标替换文本即可:
ReplaceSelectedText("你的替换内容");
内容的提问来源于stack exchange,提问作者gCyanide
相关产品推荐
相关产品推荐

