Этот ответ достаточно длинный, я положу его в слот для ответов.Я думаю, что мой ответ в основном состоит в том, что вопрос, который вы задаете, основан на неверном предположении.
Ключевая проблема заключается в том, что хотя тесты API-типа можно выполнять в фоновом режиме на том же рабочем столе, что и выпродолжая работать, редко удается сделать то же самое для тестов на основе пользовательского интерфейса.
Лучшим выбором для длительных тестов пользовательского интерфейса являются две машины и переключатель клавиатуры / монитора или использование служб терминалов для запускатестируйте приложение в отдельном сеансе, чтобы у него было собственное представление о мире (фокус, мышь, состояние клавиатуры), которое не будет мешать рабочему столу, на котором вы работаете.
Фундаментальная проблемазаключается в том, что некоторые ресурсы пользовательского интерфейса, в частности указатель мыши и фокус клавиатуры, являются общими для всех приложений на рабочем столе.И многие (большинство? Все?) Приложения предполагают, что, когда с ними взаимодействуют, они могут делать с ними что угодно.
Иногда вы можете сойти с рук, «лгая» приложению и отправляя ему сообщенияобычно это будет конечный результат ввода (например, отправка WM_LBUTTONDOWN вместо выполнения sendinput), но если приложение в конечном итоге просматривает глобальное состояние мыши, вы получите несогласованность.
Например, приложение может ответить на WM_LBUTTONDOWN, используя координаты, переданные в качестве параметров.Или он может игнорировать их и вместо этого вызывать GetCursorPos - и это может привести к действительно странному поведению, если мышь действительно находится над вашей почтовой программой вместо приложения.
Или вы можете отправить WM_LBUTTONDOWN, и приложение ответит наэто путем вызова некоторой вспомогательной функции.Вспомогательная функция использует GetKeyState (VK_LBUTTON), чтобы проверить, нажата ли кнопка мыши на самом деле - замечает, что это не так, поэтому запускается рано.
(Кроме того, отправка сообщения о конечном результате обходит другие вещи, которые приложениеможет полагаться: если вы отправляете ключи непосредственно в окно, вы обойдете большую часть кода обработки акселератора и диалога, который обычно находится в цикле сообщений.)
Если приложение использует SetCapture () - чтоочень часто встречаются такие вещи, которые можно нажимать, например кнопки и т. п. - произойдет сбой, если приложение не имеет фокуса.Вам может повезти, и приложение проигнорирует неудачу и удачу - или нет.Элементы управления типа меню часто предполагают, что приложение имеет фокус, и будут отклонять себя, если заметят, что фокус на самом деле находится в другом месте ...
Если у вас есть приложение, которое тестируется, вы можете принять это вучтите и запишите его так, чтобы его можно было «протестировать» в фоновом режиме: но имейте в виду, что он больше не работает таким образом, который согласуется с фактическим взаимодействием с пользователем - так что, возможно, это не действительный эквивалентный пользователю тестовый пример!- это зависит от вас, учитывая ваши требования к тестированию.
Короче говоря: вы могли бы получить что-то для работы здесь в этом конкретном случае, но помните, что здесь скрывается целая куча проблеми обратите внимание, что это определенно не считается лучшей практикой тестирования пользовательского интерфейса!