Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как заставить скрипт ожидать отклика программы

Ответить
Настройки темы
[решено] Как заставить скрипт ожидать отклика программы
Cem Cem вне форума

Аватара для Cem

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток!
Столкнулся с проблемой: необходимо запустить программу и когда она откроется выполнять с ней действия (например, "открыть файл"). Пока выхожу из ситуации принудительным ожиданием, но это не правильно. На одной машине нужная прога открывается за 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 просто не срабатывает.

Отправлено: 03:38, 09-02-2014

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

Отправлено: 03:48, 09-02-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

Cem Cem вне форума Автор темы

Аватара для Cem

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Последний раз редактировалось Cem, 09-02-2014 в 12:52.


Отправлено: 12:45, 09-02-2014 | #3


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Cem, Вы очень подробно всё описали, кроме главного:
Цитата Iska:
как Вы сами определяете этот факт? »
Цитата Cem:
когда прога успешно загрузилась»
и:
Цитата Cem:
в ней можно продолжать работать. »
Хотите получить некий универсальный рецепт, а сами даже не называете конкретное приложение.

Отправлено: 14:42, 09-02-2014 | #4


Вредитель


Сообщения: 460
Благодарности: 126

Профиль | Отправить PM | Цитировать


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

-------
Все сказаное является только моим личным мнением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:17, 09-02-2014 | #5

Cem Cem вне форума Автор темы

Аватара для Cem

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


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



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

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


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

Отправлено: 15:55, 09-02-2014 | #6


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:15, 09-02-2014 | #7

Cem Cem вне форума Автор темы

Аватара для Cem

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


Кажись придумал, можно высылать комбинацию "Ctrl+O" до тех пор, пока не появится нужное окно.
Код: Выделить весь код
$v1 = 0
Do	
	Send("^o")
	Sleep(1000)
	$v2 = WinExists("Open")
Until   $v1 < $v2
Каждую секунду высылает нажатие CTRL+о, до тех пор, пока не появится окно "Open".
Очень даже вариант...

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

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

Последний раз редактировалось Cem, 20-02-2014 в 11:19.


Отправлено: 16:16, 09-02-2014 | #8


Вредитель


Сообщения: 460
Благодарности: 126

Профиль | Отправить PM | Цитировать


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

-------
Все сказаное является только моим личным мнением.


Отправлено: 16:23, 09-02-2014 | #9

Cem Cem вне форума Автор темы

Аватара для Cem

Новый участник


Сообщения: 27
Благодарности: 0

Профиль | Отправить PM | Цитировать


DedAlex,
Цитата DedAlex:
Проверять раз в секунду цвет пикселя PixelGetColor? Белый (светло-серый) - ждем, темно-серый - загрузилась. »
Авантюрная идея )) Однако, "респект и уважуха" за нестандартное мышление +!

Отправлено: 11:24, 20-02-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как заставить скрипт ожидать отклика программы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Заставить скрипт расставлять по шаблону McLotos AutoIt 8 02-04-2012 21:57
Как заставить скрипт от Sanja Alone (oeminfo.cmd) видеть обновы с 9-тизначным номером JohnnyD Автоматическая установка Windows 2000/XP/2003 0 21-02-2011 12:03
Установка - Можно ли заставить работать программы из папки Windows.old 42rus Microsoft Windows 7 4 26-06-2009 17:11
Dial-Up - как заставить программы работать через два различных соединения с интернет veschiy Сетевые технологии 4 01-09-2008 09:16
putty как заставить крон запускать скрипт в назначенное время? E-mail Вебмастеру 3 30-09-2005 14:46




 
Переход