【问题标题】:Fastest way to send keystrokes C#发送击键的最快方法 C#
【发布时间】:2012-05-07 10:14:08
【问题描述】:

我想知道使用 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# .net performance testing


【解决方案1】:

如果您有很多文本要推送给客户端,您可能会注意到 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。如果你想在文本框中插入文本,这个答案是最好的选择,特别是如果文本包含 SendKey 的特殊字符,例如 {,或者奇怪的 unicode 字符等;在这种情况下,您应该小心逐个发送字符。
【解决方案2】:

SendWait() 较慢,因为它等待消息已被目标应用程序处理。 Send() 函数不会等待并尽快返回。如果应用程序有点忙,则差异会更加明显。

如果您调用Flush(),您将停止您的应用程序处理在消息队列中排队的与键盘相关的所有事件。如果您使用SendWait() 发送它们并没有多大意义,并且您会大大降低应用程序的速度,因为它在循环内(想象Flush() 作为选择性DoEvents() - 是的,有所有缺点 - 并且它也被SendWait() 自己调用)。

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

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

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

【讨论】:

  • 您有什么特别的理由相信调用SendInput 比使用日志挂钩更快(反之亦然)?
  • @CodyGray Primary 'cause MSDN: "The new implementation...稍微快一点..."无论如何我想是因为它使用更简单的机制来发送输入(只是 SendInput 而不是钩子) .
猜你喜欢
  • 2021-07-04
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多