Показать полную графическую версию : [решено] Как заставить скрипт ожидать отклика программы
Доброго времени суток!
Столкнулся с проблемой: необходимо запустить программу и когда она откроется выполнять с ней действия (например, "открыть файл"). Пока выхожу из ситуации принудительным ожиданием, но это не правильно. На одной машине нужная прога открывается за 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 просто не срабатывает.
Cem, начните с того, что ответьте себе на вопрос: а как Вы сами определяете этот факт?
Объясню ситуацию подробнее:
Запускаю программу "Proga". Появляется процесс "Proga.exe" и открывается окно программы ("Proga_Okno"). Чтобы быть точным, скажу, что визуально открывается только рамка окна. В это же время прога продолжает открываться (загружаться) и некоторое время висит. Только по прошествию некоторого времени, когда прога успешно загрузилась, в ней можно продолжать работать.
Если мы проверим исполнения программы через
If WinExists("Proga_Okno") Then ; наличие окна
либо
If ProcessExists("Proga.exe") Then ; наличие выполняемого процесса
то и окно, и процесс присутствуют с первой секунды после запуска, скрипт считает, что всё нормально (условие выполняется) и продолжает работу. Но пока программа "Proga.exe" не загрузится полностью, любые манипуляции в её окне бесполезны (будь то "Ctrl+O" или "Ctrl+А").
Теперь вопрос: Как заставить скрипт ожидать до полной загрузки программы (полной работоспособности) и только потом продолжать дальнейшие действия в ней?
Cem, Вы очень подробно всё описали, кроме главного:
как Вы сами определяете этот факт? »
когда прога успешно загрузилась»
и:
в ней можно продолжать работать. »
Хотите получить некий универсальный рецепт, а сами даже не называете конкретное приложение.
Cem, попробуйте использовать WinMenuSelectItem (http://autoit-script.ru/autoit3_docs/functions/WinMenuSelectItem.htm). Возвращаемое значение
Успех: Возвращает 1.
Ошибка: Возвращает 0, если пункт меню не найден.
Можно вызывать ее раз в секунду до ответа 1. Если появилось меню, то приложение должно прогрузиться.
Спасибо за вариант, но к сожалению, в этом случае не помогает.
Программа называется "Resolume Arena". Когда запускается выглядит так:
http://pic4net.com/di-OYX85F.png
это продолжается от 10 до 50 секунд. Время открытия зависит от многих факторов, в частности и от того какой проект был открыт в программе до этого (При повторном открытии прога открывает предыдущий проект, а не "стартует с нуля").
Хотя, возможно тут есть зацепка. Если каким-то образом заставить каждый раз открываться "с нуля". Но сейчас не об этом.
После загрузки выглядит так:
http://pic4net.com/di-CZ0564.png
Но как видно на изображении, WindowInfo не даёт информации, ни о меню, ни о HotKey. Именно это усложняет всю задачу.
Но как видно на изображении, WindowInfo не даёт информации, ни о меню, ни о HotKey. Именно это усложняет всю задачу. »
Да, нестандарные элементы управления — это печально. Я тоже думал после озвучивания Вами информации о названии приложения предложить попробовать покрутить в цикле ожидания инициализацию пункта меню.
А как насчёт варианта с «Not Responding» при загрузке приложения? Попробуйте присмотреть что-нибудь из: not responding autoit site:www.autoitscript.com - Поиск в Google (https://www.google.ru/search?q=not+responding+autoit+site:www.autoitscript.com) — с какого момента приложение подключается к очереди сообщений и готово её обслуживать?
Кажись придумал, можно высылать комбинацию "Ctrl+O" до тех пор, пока не появится нужное окно.
$v1 = 0
Do
Send("^o")
Sleep(1000)
$v2 = WinExists("Open")
Until $v1 < $v2
Каждую секунду высылает нажатие CTRL+о, до тех пор, пока не появится окно "Open".
Очень даже вариант...
Минусы: Скрипт делает много лишних операций.
Плюсы: Способ действует адекватно и на 100%.
Проверять раз в секунду цвет пикселя PixelGetColor (http://autoit-script.ru/autoit3_docs/functions/PixelGetColor.htm)? Белый (светло-серый) - ждем, темно-серый - загрузилась. Пиксель в районе меню, например, координаты 2х2.
DedAlex, Проверять раз в секунду цвет пикселя PixelGetColor? Белый (светло-серый) - ждем, темно-серый - загрузилась. »
Авантюрная идея )) Однако, "респект и уважуха" за нестандартное мышление +!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC