You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SendKeys.Send()在部分Windows10设备上失效的技术求助

嘿,我之前在部分Windows 10设备上碰到过一模一样的SendKeys问题——只输入第一个姓名的首字符,程序就直接提示任务成功了。结合我的踩坑经验,给你几个可行的解决方向:

1. 先确认输入焦点是否真的稳定住了

你给了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.");
}
2. 换掉不稳定的SendKeys,用更可靠的输入库

SendKeys本身是个老组件,在不同Windows版本、尤其是有UAC权限差异的环境下很容易出问题。我后来换成了InputSimulator这个NuGet包,它基于Windows的原生输入模拟API,稳定性高很多。

步骤:

  1. 在NuGet包管理器中搜索并安装WindowsInput
  2. 替换原有的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设备上测试都没问题。

3. 检查系统的“过滤键”设置

Win10的辅助功能里的过滤键可能会阻止快速连续输入,导致只识别第一个字符。你可以让受影响的用户检查:

  • 打开设置 → 轻松访问 → 键盘 → 找到“过滤键”
  • 确保“启用过滤键”是关闭状态

如果用户开启了这个功能,SendKeys的快速输入会被系统过滤掉,只保留第一个字符。

4. 权限问题:确保程序和目标应用权限匹配

如果目标应用是以管理员身份运行的,而你的程序是普通权限,SendKeys会失效(因为系统阻止了跨权限的输入模拟)。解决办法:

  • 右键你的程序,选择“以管理员身份运行”测试
  • 或者给程序添加管理员权限清单:在项目里添加app.manifest文件,修改requestedExecutionLevel为:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

这样程序启动时会自动请求管理员权限,和目标应用权限一致后,输入模拟就能正常工作了。

建议先从第1、3点试起,这两个是最常见的原因,如果不行再换InputSimulator(这个是终极解决方案)。

内容的提问来源于stack exchange,提问作者thibeastmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:37:45