Самый быстрый способ отправить нажатия клавиш C#

мне было интересно, какой самый быстрый способ отправить нажатия клавиш с помощью 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

мне было интересно, почему эти изменения в коде делают скорость совсем другой.

мне также было интересно, есть ли более быстрый способ отправки многих нажатий клавиш, так как мое приложение делает это много. (Эти тесты были сделаны на очень медленном нетбуке)

спасибо!

2 ответов


SendWait() медленнее, потому что он ждет что сообщение было обработано целевым приложением. The Send() функция вместо этого не ждет и возвращается как можно скорее. Если приложение каким-то образом занято, разница может быть еще более очевидной.

если вы называете Flush() вы остановите приложение для обработки все события, связанные с клавиатурой, которые стоят в очереди сообщений. Это не имеет большого смысла, если вы послали их использование SendWait() и вы будете сильно замедлять приложение, потому что оно находится внутри цикла (представьте себе Flush() как селективный DoEvents() - да, со всеми его недостатками - и это называется ).

если вас интересует его производительность (но они всегда будут ограничены скоростью, с которой ваше приложение может обрабатывать сообщения) пожалуйста, прочитайте это на MSDN. В сумме вы можете изменить SendKeys класс для использования SendInput функция, а не a журнальный крюк. В качестве краткой справки просто добавьте этот параметр в свое приложение.конфигурационный файл:

<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. Он перешел от утомительного выклевывания 30 цифр примерно за 4 секунды до мгновенной вставки всего за секунду.

один очевидный недостаток заключается в том, что это может испортить использование буфера обмена вашим пользователем. Другое дело, что это не помогает, если вы собираетесь отправлять управляющие коды, такие как TAB или F5, а не просто старый текст.