Рекомендации по использованию API SendInput

Я работаю над библиотекой автоматического тестирования и хочу имитировать ввод с помощью мыши и клавиатуры с помощью SendInput Win32 API. Этот API позволяет передавать несколько элементов ввода за один вызов API. В Интернете есть ряд других примеров и подобных библиотек, использующих SendInput. Многие из них передают одну операцию ввода для каждого вызова API. Есть ли какие-либо преимущества в пакетном вводе или использовании одного ввода для каждого вызова SendInput? Документация, похоже, не предлагает руководства, или, возможно, я неправильно ее читаю.


person JimEvans    schedule 06.01.2013    source источник
comment
Единственный намек, который я смог прочитать из документации, был следующий: Эти события не перемежаются с другими событиями ввода с клавиатуры или мыши. Итак, если вы отправляете комбинации клавиш, это вероятно, лучше всего отправить их одним пакетом, чтобы другие события ввода не смешивали состояние клавиатуры.   -  person IInspectable    schedule 06.01.2013
comment
Безусловно, лучше всего не использовать SendInput. Используйте существующую поддержку автоматизации пользовательского интерфейса. Например, msdn.microsoft.com/en-us /library/ee684009%28v=VS.85%29.aspx   -  person Hans Passant    schedule 06.01.2013
comment
@HansPassant: это действительно зависит от того, что вы пытаетесь сделать. UIA имеет только базовую поддержку для манипуляций с пользовательским интерфейсом, и в некоторых случаях это не согласуется с той же операцией, выполняемой с помощью мыши / клавиатуры. Распространенным шаблоном автоматизации тестирования является использование пользовательского интерфейса пользователя для чтения и проверки ожидаемого состояния пользовательского интерфейса до и после операции, а также для определения местоположения целевого элемента пользовательского интерфейса, но с использованием SendInput для выполнения фактических манипуляций. Кроме того, некоторые типы операций ввода - горячие клавиши или пользовательские события мыши, такие как перетаскивание - не поддерживаются UIA, поэтому требуется SendInput.   -  person BrendanMcK    schedule 07.01.2013
comment
@Tim: это не очень важно для автоматизации тестирования, когда среда в некоторой степени контролируется, и вам обычно не нужно беспокоиться о вводе пользователем данных, которые могут помешать тесту во время выполнения теста. Утилита для воспроизведения макросов, с другой стороны, должна будет позаботиться о нетерпеливом или наивном пользователе и принять это во внимание. (Используя BlockInput () - еще один способ сделать это.)   -  person BrendanMcK    schedule 07.01.2013
comment
@BrendanMcK: Я ценю ваше понимание. Мне действительно нужно беспокоиться об автоматизации нескольких окон в приложении, но это совсем другая история. Я уже думал о BlockInput().   -  person JimEvans    schedule 07.01.2013


Ответы (1)


Я знаю, что нет никакой реальной пользы от одной техники по сравнению с другой. В любом случае обычная потенциальная проблема с SendInput заключается в том, что фокус ввода может меняться между тем, когда вы отправляете ввод, и тем, когда ввод принимается целевым приложением. Классический пример - модальное диалоговое окно, которое появляется асинхронно, чтобы предупредить пользователя о некоторой проблеме, и в конечном итоге крадет фокус и впитывает оставшийся ввод, который должен был пойти в другом месте. В этом сценарии нет разницы между последовательной серией SendInputs и одиночным SendInput.

(Я почти уверен, что внутри SendInput в любом случае просто перебирает переданные ему входы ...)

person BrendanMcK    schedule 07.01.2013