如何通过编程触发Windows + H语音听写功能?
在Windows应用中激活Win+H语音听写功能的实现方案
要在Windows应用中激活Win+H对应的语音听写功能,不同开发框架的实现方式略有差异,以下是主流平台的具体方案:
1. WinForms/WPF 应用(.NET Framework/.NET 5+)
方法1:使用SendKeys模拟快捷键
这种方式最简单,适合快速实现,需确保应用当前处于前台(拥有焦点):
// WinForms/WPF 中直接调用 SendKeys.SendWait("{WIN}h");
注:部分环境下可能需要先将应用窗口置顶,确保焦点在当前应用内。
方法2:使用Windows API(SendInput)更可靠
如果SendKeys存在稳定性问题,可直接调用user32.dll的SendInput函数发送按键消息,兼容性更强:
using System; using System.Runtime.InteropServices; public static class KeyboardSimulator { [StructLayout(LayoutKind.Sequential)] private struct INPUT { public uint type; public InputUnion u; } [StructLayout(LayoutKind.Explicit)] private struct InputUnion { [FieldOffset(0)] public KEYBDINPUT ki; [FieldOffset(0)] public MOUSEINPUT mi; [FieldOffset(0)] public HARDWAREINPUT hi; } [StructLayout(LayoutKind.Sequential)] private struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] private struct MOUSEINPUT { public int dx; public int dy; public uint mouseData; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } [StructLayout(LayoutKind.Sequential)] private struct HARDWAREINPUT { public uint uMsg; public ushort wParamL; public ushort wParamH; } private const uint INPUT_KEYBOARD = 1; private const uint KEYEVENTF_KEYUP = 0x0002; private const ushort VK_LWIN = 0x5B; private const ushort VK_H = 0x48; [DllImport("user32.dll", SetLastError = true)] private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); public static void SimulateWinH() { INPUT[] inputs = new INPUT[4]; // 按下左Windows键 inputs[0].type = INPUT_KEYBOARD; inputs[0].u.ki.wVk = VK_LWIN; // 按下H键 inputs[1].type = INPUT_KEYBOARD; inputs[1].u.ki.wVk = VK_H; // 松开H键 inputs[2].type = INPUT_KEYBOARD; inputs[2].u.ki.wVk = VK_H; inputs[2].u.ki.dwFlags = KEYEVENTF_KEYUP; // 松开Windows键 inputs[3].type = INPUT_KEYBOARD; inputs[3].u.ki.wVk = VK_LWIN; inputs[3].u.ki.dwFlags = KEYEVENTF_KEYUP; SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT))); } } // 调用方式 KeyboardSimulator.SimulateWinH();
2. UWP 应用
UWP推荐使用官方语音识别API直接启动听写,更符合平台规范:
using Windows.Media.SpeechRecognition; public async Task StartDictation() { var recognizer = new SpeechRecognizer(); // 添加听写约束 var dictationConstraint = new SpeechRecognitionTopicConstraint(SpeechRecognitionScenario.Dictation, "Dictation"); recognizer.Constraints.Add(dictationConstraint); await recognizer.CompileConstraintsAsync(); // 启动听写会话 var result = await recognizer.RecognizeAsync(); if (result.Status == SpeechRecognitionResultStatus.Success) { // 将识别结果插入目标控件 YourTextBox.Text = result.Text; } }
需在Package.appxmanifest中添加权限:
<Capabilities> <uap:Capability Name="microphone" /> <uap:Capability Name="speechRecognition" /> </Capabilities>
3. .NET MAUI 应用(Windows端)
MAUI可通过平台特定代码调用Windows原生API实现:
#if WINDOWS using System.Runtime.InteropServices; public void ActivateWinHDictation() { KeyboardSimulator.SimulateWinH(); } // 复用之前的KeyboardSimulator类 public static class KeyboardSimulator { // 此处省略与WinForms/WPF中相同的结构体和DllImport定义 // ... public static void SimulateWinH() { // 与之前的实现一致 } } #endif
也可直接调用UWP的语音识别API,需用条件编译包裹代码,并通过MainThread更新UI:
#if WINDOWS using Windows.Media.SpeechRecognition; using Microsoft.Maui.ApplicationModel; public async Task StartDictation() { var recognizer = new SpeechRecognizer(); var dictationConstraint = new SpeechRecognitionTopicConstraint(SpeechRecognitionScenario.Dictation, "Dictation"); recognizer.Constraints.Add(dictationConstraint); await recognizer.CompileConstraintsAsync(); var result = await recognizer.RecognizeAsync(); if (result.Status == SpeechRecognitionResultStatus.Success) { MainThread.BeginInvokeOnMainThread(() => { YourEntry.Text = result.Text; }); } } #endif
注意事项
- 权限配置:所有涉及语音识别的应用都需要开启麦克风权限,需在对应平台的权限清单中声明。
- 系统要求:Win+H听写功能仅支持Windows 10及以上版本,且系统需已启用语音识别服务。
- 焦点问题:模拟快捷键时,若需全局激活听写,无需限制应用焦点(Win+H本身是全局快捷键)。
内容的提问来源于stack exchange,提问作者user16755780
相关产品推荐
相关产品推荐

