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

C#无app.config时如何等待SendKeys完成按键发送再执行后续代码

.NET Core/.NET 5 中SendKeys.SendWait同步执行的最优实现方案

.NET Framework 时代是通过 app.config 配置 SendKeys 的底层实现模式,保证按键发送同步完成,.NET Core 及后续版本取消了 app.config 的相关配置入口,官方提供了直接的代码配置方案作为替代,也是当前场景的最优解:

方案实现步骤

  1. 在应用程序入口(通常是 Program.cs 的 Main 方法)的窗体初始化逻辑之前,调用Application.SetSendKeysMode方法,传入SendKeysMode.SendInput参数
  2. 后续调用SendKeys.SendWait时,会自动等待所有按键事件全部发送、被目标窗口处理完成后,再执行后续代码,和 .NET Framework 改配置的效果完全一致

代码示例

using System;
using System.Windows.Forms;

namespace SendKeysDemo
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            // 核心配置:指定SendKeys使用SendInput同步实现
            Application.SetSendKeysMode(SendKeysMode.SendInput);
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}

可选参数说明

  • SendKeysMode.SendInput:优先使用系统级的 SendInput API 发送按键,准确率最高,同步性最好,是官方推荐的选项
  • SendKeysMode.PostMessage:使用窗口消息投递的方式发送,兼容性稍差,适合特殊场景使用
  • SendKeysMode.JournalHook:使用日志钩子的旧实现,为兼容极老版本系统保留,不推荐使用

备选兼容方案(仅用于不支持SetSendKeysMode的极特殊场景)

如果因为版本限制无法使用上述原生 API,可以通过手动排空消息队列的方式保证同步,稳定性略低于原生方案:

// 发送按键
SendKeys.SendWait("test{ENTER}");

// 循环处理消息队列,确保所有按键事件处理完成
for (int i = 0; i < 5; i++)
{
    Application.DoEvents();
    Thread.Sleep(20);
}

// 此处开始执行后续业务代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:39:04