发送击键 C# 的最快方式

本文关键字:方式 | 更新日期: 2023-09-27 18:33:20

我想知道使用 C# 发送击键的最快方法是什么。目前我正在使用SendKeys.Send()SendKeys.SendWait()SendKeys.Flush().

我使用以下代码来计算它们工作所需的时间:

Stopwatch sw1 = new Stopwatch();
sw1.Start();
for (int a = 1; a <= 1000; a++)
{
    SendKeys.Send("a");
    SendKeys.Send("{ENTER}");
}
sw1.Stop();

和:

Stopwatch sw2 = new Stopwatch();
sw2.Start();
for (int b = 1; b <= 1000; b++)
{
    SendKeys.SendWait("b");
    SendKeys.SendWait("{ENTER}");
    SendKeys.Flush();
}
sw2.Stop();

2 的结果是:

Result 1: 40119 milliseconds
Result 2: 41882 milliseconds

现在,如果我们把SendKeys.Flush()放在第二个测试中,在循环之外,我们得到:

Result 3: 46278 milliseconds

我想知道为什么代码中的这些更改会使速度非常不同。

我还想知道是否有一种更快的方法来发送许多击键,因为我的应用程序经常这样做。(这些测试是在非常慢的上网本上完成的(

谢谢!

发送击键 C# 的最快方式

SendWait()速度较慢,因为它等待目标应用程序处理消息。相反,Send()函数不会等待并尽快返回。如果应用程序以某种方式繁忙,则差异可能会更加明显。

如果调用Flush()将停止应用程序以处理与消息队列中排队的键盘相关的所有事件。如果您使用 SendWait() 发送它们,这没有太大意义,并且您会减慢应用程序的速度,因为它在循环内(想象Flush()是一个选择性DoEvents() - 是的,它的所有缺点 - 它也是由SendWait()本身调用的(。

如果您对它的性能感兴趣(但它们始终受限于应用程序处理消息的速度(,请在 MSDN 上阅读此内容。总之,您可以将 SendKeys 类更改为使用 SendInput 函数,而不是日志钩子。作为快速参考,只需将此设置添加到 app.config 文件:

<appSettings>
    <add key="SendKeys" value="SendInput"/>
</appSettings>

无论如何,新实现的目标不是速度,而是不同版本的Windows和选项之间的一致行为(我猜,提高性能是一种副作用(。

如果你有很多文本要推送到客户端,你可能会注意到SendKeys真的很慢。您可以使用剪贴板大大加快速度。这个想法是将要"键入"的文本放入剪贴板的目标文本框中,然后将 CTRL-V 发送到目标应用程序以粘贴该文本。下面是一个插图:

Clipboard.Clear();  // Always clear the clipboard first
Clipboard.SetText(TextToSend);
SendKeys.SendWait("^v");  // Paste

我发现这对我来说很有效,使用无线条形码扫描仪,该扫描仪通过WiFi与主机应用程序通信,该主机应用程序将长条形码发送到在Google Chrome中运行的Web应用程序。它从在大约 30 秒内乏味地啄出 4 位数字到在一秒钟内立即粘贴所有数字。

一个明显的缺点是这可能会扰乱用户对剪贴板的使用。另一个是,如果您打算发送 TAB 或 F5 等控制代码而不仅仅是纯旧文本,则无济于事。