我想知道使用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
我想知道为什么代码中的这些变化会使速度变得非常不同。
我还想知道是否有更快的方式发送许多击键,因为我的应用程序做了很多。 (这些测试是在非常慢的上网本上完成的)
谢谢!
答案 0 :(得分:11)
如果您有很多文本要推送给客户,您可能会注意到SendKeys真的很迟钝。您可以使用剪贴板大大加快速度。我们的想法是将您希望“键入”的文本放入剪贴板中的目标文本框,然后将CTRL-V发送到目标应用程序以粘贴该文本。这是一个例子:
Clipboard.Clear(); // Always clear the clipboard first
Clipboard.SetText(TextToSend);
SendKeys.SendWait("^v"); // Paste
我发现这对我来说非常适合使用无线条形码扫描仪,它通过WiFi与主机应用程序通信,该应用程序向Google Chrome中运行的网络应用程序发送长条形码。它在大约4秒钟内从繁琐地掏出30个数字,然后在一秒钟内即刻粘贴。
一个明显的缺点是,这可能会影响用户对剪贴板的使用。另一个原因是,如果您打算发送控制代码(如TAB或F5)而不是普通的旧文本,它将无济于事。
答案 1 :(得分:10)
SendWait()
速度较慢,因为它等待目标应用程序已处理该消息。 Send()
函数不会等待并尽快返回。如果应用程序在某种程度上很繁忙,那么差异就会更加明显。
如果您致电Flush()
,您将停止应用程序处理与在消息队列中排队的键盘相关的所有事件。如果你使用SendWait()
发送它们并没有多大意义,你会减慢应用程序的速度,因为它在循环内部(想象Flush()
作为选择性DoEvents()
- 是的有它的所有缺点 - 它也由SendWait()
本身调用。)
如果您对其效果感兴趣(但它们总是受限于您的应用程序处理邮件的速度),请阅读this on MSDN。总之,您可以更改SendKeys
类以使用SendInput
函数,而不是日志钩子。作为快速参考,只需将此设置添加到app.config文件:
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
无论如何,新实现的目标不是速度,而是跨越不同版本的Windows和选项的一致行为(增加的性能是一种副作用,我猜)。