Отправка нескольких нажатий клавиш WatiN

Итак, я запускаю тесты в WatiN и использую метод SendKeys. Согласно веб-сайту MSDN, я могу ввести:

System.Windows.Forms.SendKeys.SendWait("{LEFT 2}");

И это войдет влево два раза. Однако это не работает, я считаю, потому что приложению требуется время между каждым нажатием клавиши. Я приказываю делать то, что мне нужно, чтобы программа делала. Я использовал Thread.Sleep между каждым нажатием клавиши, чтобы убедиться, что они читаются. Есть ли более эффективный/правильный способ сделать это? Это мой текущий код метода:

System.Windows.Forms.SendKeys.SendWait("{LEFT}");
Thread.Sleep(500);
System.Windows.Forms.SendKeys.SendWait("{LEFT}");
Thread.Sleep(500);
System.Windows.Forms.SendKeys.SendWait("{ENTER}");

person Emerica.    schedule 20.12.2011    source источник
comment
У меня была проблема с этим при попытке отладки. Я думаю, что sendkey отправляет в активное окно. И поскольку я установил точку останова, активное окно было изменено на визуальную студию.   -  person Phil Lambert    schedule 20.12.2011
comment
Это может помочь... stackoverflow.com/questions/5597848/key-strokes-in-watin   -  person Phil Lambert    schedule 20.12.2011
comment
Спасибо, но моя проблема не в том, что это не сработает. Нажатия клавиш читаются, просто мне было интересно, есть ли более умный способ сделать это.   -  person Emerica.    schedule 20.12.2011


Ответы (1)


К сожалению, я не верю, что есть. Согласно MSDN, существуют проблемы со временем с SendKeys:

Класс SendKeys подвержен проблемам синхронизации, которые некоторым разработчикам приходилось обходить. Обновленная реализация по-прежнему подвержена проблемам с синхронизацией, но работает немного быстрее и может потребовать внесения изменений в обходные пути.

Класс SendKeys сначала пытается использовать предыдущую реализацию, а если это не удается, использует новую реализацию.

В результате класс SendKeys может вести себя по-разному в разных операционных системах. Кроме того, когда класс SendKeys использует новую реализацию, метод SendWait не будет ждать обработки сообщений при их отправке другому процессу. Если ваше приложение полагается на согласованное поведение независимо от операционной системы, вы можете заставить класс SendKeys использовать новую реализацию, добавив следующий параметр приложения в файл app.config.

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

Чтобы заставить класс SendKeys использовать предыдущую реализацию, вместо этого используйте значение "JournalHook".

Вы можете попробовать изменить реализацию, чтобы увидеть, есть ли изменения в ваших результатах.

В качестве альтернативы, согласно этому сообщению, просто используйте Thread.Sleep(0); после того, как ваш ввод должен Работа. Не самое элегантное решение, но если оно сработает, то будет быстрее, чем пауза в 500 мс.

person Bryan Weaver    schedule 20.12.2011
comment
Не знаю, Sleep(0) у меня не работает. Они все равно не читают. Тем не менее, мне кажется, что на самом деле нет лучшего способа сделать это. - person Emerica.; 20.12.2011