Проблема автоматического клика - PullRequest
1 голос
/ 17 апреля 2009

Я пишу программу для автоматического тестирования, которая случайным образом щелкает открытое окно приложения, используя различные вызовы библиотеки User32.dll. Моя текущая проблема заключается в том, что, если щелчок откроет диалоговое окно, использование Process.WaitForInputIdle () не заставит себя долго ждать, пока этот диалог будет обнаружен при следующем обходе цикла, что означает, что несколько щелчков получаются, и если эти щелчки происходят Быть на что-то в диалоге, который я хочу избежать (скажем, кнопка выхода), нет никакого способа сказать это заранее. У меня вопрос такой. Есть ли способ ожидания завершения процесса или потока всей обработки и повторного ожидания только в цикле сообщений?

Надеюсь, это имело смысл.

Приветствия

Ross

EDIT

Если это не удастся, можно ли каким-то образом настроить процесс / потоки целевой программы и моей программы на использование одного и того же процессора и настроить приоритеты каждого так, чтобы целевая программа получила предпочтение?

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

WaitForInputIdle, к сожалению, вернется, как только приложение будет в цикле сообщений без ожидающих входных сообщений.

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

0 голосов
/ 22 апреля 2009

Обходным путем кажется использование API SendMessage вместо mouse_event или SendInput API. Причина этого заключается в том, что SendMessage блокирует, пока он не будет обработан. Просто убедитесь, что вы всегда получаете дескриптор окна сразу под тем местом, где вы хотите щелкнуть (используя WindowFromPoint) и конвертировать координаты мыши из экрана в клиентские координаты с помощью ScreenToClient. Упакуйте координаты в параметр lParam, используя ((pt.Y << 16) + pt.X). Это будет блокировать до обработки, поэтому любые показанные модальные диалоги будут блокировать этот вызов. </p>

...