SendKeys.Send()在部分Windows10设备上失效的技术求助
嘿,我之前在部分Windows 10设备上碰到过一模一样的SendKeys问题——只输入第一个姓名的首字符,程序就直接提示任务成功了。结合我的踩坑经验,给你几个可行的解决方向:
你给了8秒让用户切换输入位置,但有些Win10设备上,窗口激活的响应速度慢,或者切换过程中焦点意外丢失,导致SendKeys只发送了第一个字符就没了目标。
解决办法是强制激活目标窗口,并且在发送前加一段短延迟确保焦点到位。你可以借助Windows API来实现:
首先在代码里引入user32.dll的方法:
using System.Runtime.InteropServices; [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();
然后在弹出提示框之后、发送循环之前,先获取用户选中的窗口句柄,发送前再激活一次:
// 弹出提示框后,先获取当前用户选中的窗口句柄 IntPtr targetWindow = GetForegroundWindow(); Thread.Sleep(1000); // 给1秒确保用户切换完成 try { foreach (string x in Values) { // 每次发送前强制激活目标窗口 SetForegroundWindow(targetWindow); Thread.Sleep(200); // 给窗口激活留时间 string strSendkeys = x + Split; SendKeys.SendWait(strSendkeys); SendKeys.Flush(); // 强制清空输入队列,确保所有按键都发送 if (strSplitValue == "ENTER") { Thread.Sleep(1200); SendKeys.SendWait("{ENTER}"); SendKeys.Flush(); Thread.Sleep(200); } } MessageBox.Show("Task succeeded!", "Succeeded!", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch { MessageBox.Show("Something went wrong."); }
SendKeys本身是个老组件,在不同Windows版本、尤其是有UAC权限差异的环境下很容易出问题。我后来换成了InputSimulator这个NuGet包,它基于Windows的原生输入模拟API,稳定性高很多。
步骤:
- 在NuGet包管理器中搜索并安装
WindowsInput - 替换原有的SendKeys代码:
using WindowsInput; using WindowsInput.Native; // ... 其他代码不变 ... try { var inputSimulator = new InputSimulator(); foreach (string x in Values) { // 输入姓名 inputSimulator.Keyboard.TextEntry(x); // 输入分隔符 if (!string.IsNullOrEmpty(Split)) { inputSimulator.Keyboard.TextEntry(Split); } // 处理回车情况 if (strSplitValue == "ENTER") { Thread.Sleep(1200); inputSimulator.Keyboard.KeyPress(VirtualKeyCode.RETURN); Thread.Sleep(200); } } MessageBox.Show("Task succeeded!", "Succeeded!", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch { MessageBox.Show("Something went wrong."); }
这个库几乎不会出现字符截断的问题,我在多台Win10/11设备上测试都没问题。
Win10的辅助功能里的过滤键可能会阻止快速连续输入,导致只识别第一个字符。你可以让受影响的用户检查:
- 打开设置 → 轻松访问 → 键盘 → 找到“过滤键”
- 确保“启用过滤键”是关闭状态
如果用户开启了这个功能,SendKeys的快速输入会被系统过滤掉,只保留第一个字符。
如果目标应用是以管理员身份运行的,而你的程序是普通权限,SendKeys会失效(因为系统阻止了跨权限的输入模拟)。解决办法:
- 右键你的程序,选择“以管理员身份运行”测试
- 或者给程序添加管理员权限清单:在项目里添加
app.manifest文件,修改requestedExecutionLevel为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
这样程序启动时会自动请求管理员权限,和目标应用权限一致后,输入模拟就能正常工作了。
建议先从第1、3点试起,这两个是最常见的原因,如果不行再换InputSimulator(这个是终极解决方案)。
内容的提问来源于stack exchange,提问作者thibeastmo

