如何捕获Dragon Medical Practice Edition 4(DMPE4)语音转写内容到WPF文本框
实现方案
核心原理
Dragon Medical Practice Edition 4 (DMPE4) 输出转写文本的底层逻辑是向当前系统前台窗口的焦点控件发送标准WM_CHAR Windows消息,或是通过SendInput接口模拟文本输入,不需要调用其私有SDK即可实现定向捕获。
具体实现步骤
- 首先给你的WPF窗口添加激活状态检测逻辑,仅当窗口处于激活状态时触发拦截逻辑,不影响其他应用正常使用
- 重写WPF窗口的
OnPreviewTextInput路由事件,标记所有输入的文本为已处理,同时将输入内容追加到目标文本框的光标上次停留位置:
// 记录文本框上次的光标位置 private int _lastCaretIndex = 0; // 文本框失去焦点时记录当前光标位置 private void TargetTextBox_LostFocus(object sender, RoutedEventArgs e) { if (sender is TextBox tb) { _lastCaretIndex = tb.CaretIndex; } } // 窗口层级拦截所有文本输入 protected override void OnPreviewTextInput(TextCompositionEventArgs e) { // 窗口激活时才走定向输入逻辑 if (this.IsActive) { // 把输入内容插入到记录的光标位置 TargetTextBox.Text = TargetTextBox.Text.Insert(_lastCaretIndex, e.Text); // 更新光标位置 _lastCaretIndex += e.Text.Length; TargetTextBox.CaretIndex = _lastCaretIndex; // 标记事件已处理,阻止输入到窗口内其他控件 e.Handled = true; } base.OnPreviewTextInput(e); }
- 如果遇到DMPE4发送的特殊控制字符(比如退格、换行),额外重写
OnPreviewKeyDown事件做适配处理,对应调整文本框内容和光标位置即可 - 如果需要兼容DMPE4的语音命令功能(比如选中文本、删除内容等原生功能),可以在拦截到对应命令触发的快捷键/消息时,直接调用WPF文本框的对应操作接口,不需要修改DMPE4的任何配置
注意事项
- 不需要使用
System.Speech相关的微软语音识别库,该实现完全基于Windows系统消息拦截,和DMPE4的识别逻辑完全解耦,不会影响DMPE4的医学词库、自定义命令等所有原有功能 - 不需要修改DMPE4的任何配置,默认输出模式下即可生效,比自带的Dictation Box少了导出文本的额外操作
内容的提问来源于stack exchange,提问作者Pryach
相关产品推荐
相关产品推荐

