Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как заставить скрипт ожидать отклика программы (http://forum.oszone.net/showthread.php?t=277393)

Cem 09-02-2014 03:38 2305768

Как заставить скрипт ожидать отклика программы
 
Доброго времени суток!
Столкнулся с проблемой: необходимо запустить программу и когда она откроется выполнять с ней действия (например, "открыть файл"). Пока выхожу из ситуации принудительным ожиданием, но это не правильно. На одной машине нужная прога открывается за 20 секунд, а на другой за 50. Хочется, чтобы выполняющийся скрипт мог определить, когда прога ПОЛНОСТЬЮ загрузилась и продолжил следующие действия.

Код:

Run("C:\Program Files (x86)\Proga.exe")    ; Запустил необходимую прогу
Sleep(20000)  ; Принудительно жду 20 секунд пока прога загрузится (иногда нужно 50 сек)

If WinExists("Proga_Okno") Then                ; Проверяю наличие окна программы
WinActivate("Proga_Okno")                      ; и активирую его,
WinWaitActive("Proga_Okno")    ; жду, когда активируется (на случай подвисания машины)
Sleep(1000)

Send("^o")                  ; Выполняю дальнейшие действия: Ctrl+O - Открыть файл
WinWait("Proga_File")


Если прога не загружается полностью за 20 сек, то Ctrl+O просто не срабатывает.

Iska 09-02-2014 03:48 2305769

Cem, начните с того, что ответьте себе на вопрос: а как Вы сами определяете этот факт?

Cem 09-02-2014 12:45 2305865

Объясню ситуацию подробнее:
Запускаю программу "Proga". Появляется процесс "Proga.exe" и открывается окно программы ("Proga_Okno"). Чтобы быть точным, скажу, что визуально открывается только рамка окна. В это же время прога продолжает открываться (загружаться) и некоторое время висит. Только по прошествию некоторого времени, когда прога успешно загрузилась, в ней можно продолжать работать.
Если мы проверим исполнения программы через

Код:

If WinExists("Proga_Okno") Then      ; наличие окна
либо
Код:

If ProcessExists("Proga.exe") Then    ; наличие выполняемого процесса
то и окно, и процесс присутствуют с первой секунды после запуска, скрипт считает, что всё нормально (условие выполняется) и продолжает работу. Но пока программа "Proga.exe" не загрузится полностью, любые манипуляции в её окне бесполезны (будь то "Ctrl+O" или "Ctrl+А").

Теперь вопрос: Как заставить скрипт ожидать до полной загрузки программы (полной работоспособности) и только потом продолжать дальнейшие действия в ней?

Iska 09-02-2014 14:42 2305923

Cem, Вы очень подробно всё описали, кроме главного:
Цитата:

Цитата Iska
как Вы сами определяете этот факт? »

Цитата:

Цитата Cem
когда прога успешно загрузилась»

и:
Цитата:

Цитата Cem
в ней можно продолжать работать. »

Хотите получить некий универсальный рецепт, а сами даже не называете конкретное приложение.

DedAlex 09-02-2014 15:17 2305952

Cem, попробуйте использовать WinMenuSelectItem.
Цитата:

Возвращаемое значение
Успех: Возвращает 1.
Ошибка: Возвращает 0, если пункт меню не найден.
Можно вызывать ее раз в секунду до ответа 1. Если появилось меню, то приложение должно прогрузиться.

Cem 09-02-2014 15:55 2305982

Спасибо за вариант, но к сожалению, в этом случае не помогает.
Программа называется "Resolume Arena". Когда запускается выглядит так:



это продолжается от 10 до 50 секунд. Время открытия зависит от многих факторов, в частности и от того какой проект был открыт в программе до этого (При повторном открытии прога открывает предыдущий проект, а не "стартует с нуля").
Хотя, возможно тут есть зацепка. Если каким-то образом заставить каждый раз открываться "с нуля". Но сейчас не об этом.

После загрузки выглядит так:


Но как видно на изображении, WindowInfo не даёт информации, ни о меню, ни о HotKey. Именно это усложняет всю задачу.

Iska 09-02-2014 16:15 2305990

Цитата:

Цитата Cem
Но как видно на изображении, WindowInfo не даёт информации, ни о меню, ни о HotKey. Именно это усложняет всю задачу. »

Да, нестандарные элементы управления — это печально. Я тоже думал после озвучивания Вами информации о названии приложения предложить попробовать покрутить в цикле ожидания инициализацию пункта меню.

А как насчёт варианта с «Not Responding» при загрузке приложения? Попробуйте присмотреть что-нибудь из: not responding autoit site:www.autoitscript.com - Поиск в Google — с какого момента приложение подключается к очереди сообщений и готово её обслуживать?

Cem 09-02-2014 16:16 2305992

Кажись придумал, можно высылать комбинацию "Ctrl+O" до тех пор, пока не появится нужное окно.
Код:

$v1 = 0
Do       
        Send("^o")
        Sleep(1000)
        $v2 = WinExists("Open")
Until  $v1 < $v2

Каждую секунду высылает нажатие CTRL+о, до тех пор, пока не появится окно "Open".
Очень даже вариант...

Минусы: Скрипт делает много лишних операций.

Плюсы: Способ действует адекватно и на 100%.

DedAlex 09-02-2014 16:23 2306002

Проверять раз в секунду цвет пикселя PixelGetColor? Белый (светло-серый) - ждем, темно-серый - загрузилась. Пиксель в районе меню, например, координаты 2х2.

Cem 20-02-2014 11:24 2312345

DedAlex,
Цитата:

Цитата DedAlex
Проверять раз в секунду цвет пикселя PixelGetColor? Белый (светло-серый) - ждем, темно-серый - загрузилась. »

Авантюрная идея )) Однако, "респект и уважуха" за нестандартное мышление +!


Время: 12:15.

Время: 12:15.
© OSzone.net 2001-