发送击键C#的最快方法

mat*_*ewr 8 .net c# testing performance

我想知道使用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();
Run Code Online (Sandbox Code Playgroud)

和:

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

2的结果是:

Result 1: 40119 milliseconds
Result 2: 41882 milliseconds
Run Code Online (Sandbox Code Playgroud)

现在,如果我们SendKeys.Flush()进行第二次测试,在循环之外,我们得到:

Result 3: 46278 milliseconds
Run Code Online (Sandbox Code Playgroud)

我想知道为什么代码中的这些变化会使速度变得非常不同.

我也想知道是否有更快的方式发送许多击键,因为我的应用程序做了很多.(这些测试是在非常慢的上网本上完成的)

谢谢!

Adr*_*tti 11

SendWait()因为它等待目标应用程序处理了消息,所以速度较慢.该Send()函数不会等待并尽快返回.如果应用程序在某种程度上很忙,那么差异就会更加明显.

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

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

<appSettings>
    <add key="SendKeys" value="SendInput"/>
</appSettings>
Run Code Online (Sandbox Code Playgroud)

无论如何,新实现的目标不是速度,而是跨不同版本的Windows和选项的一致行为(增加的性能是一种副作用,我猜).


Jim*_*lli 11

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

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

我发现这对我来说非常适合使用无线条形码扫描仪,它通过WiFi与主机应用程序通信,该应用程序向Google Chrome中运行的网络应用程序发送长条形码.它在大约4秒钟内从繁琐地掏出30个数字到瞬间粘贴在一秒钟之内.

一个明显的缺点是,这可能会影响用户对剪贴板的使用.另一个原因是,如果您打算发送控制代码(如TAB或F5)而不仅仅是普通的旧文本,它将无济于事.