Что нового

[Автоматизация] Реакция на возможное открытие окна.

pashkovka

Новичок
Сообщения
18
Репутация
0
Версия AutoIt: 3.

Описание: Написал скрипт для автоматизации установки и настройки программки(OpenVPN). Столкнулся с проблемой, что при работе данного скрипта может выскочить сообщение безопасности а может и нет. НЕ МОГУ сделать так, чтобы - скрипт запустил определенные действия в случае появления определенного окна. Но если оно не появиться то выполнял свой стандартный код. Очень надеюсь на вашу помощь.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
начал делать, то выложи скрипт. чтобы тем, кто захочет помочь с нуля не начинать.
тему переношу в раздел для новичков
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Код:
#RequireAdmin
BlockInput(1)
Run("C:\open\openvpn.exe")

WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Welcome to the OpenVPN 2.2.1  Setup Wizard","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","License Agreement","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Components","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Install Location","Button2")

Вот тут возможно появление сообщения безопасности.
Для него я написал следущее
Код:
WinWaitActive("Безопасность Windows")
Sleep(400)
Send("{TAB}")
Sleep(400)
Send("{TAB}")
Sleep(400)
Send("{TAB}")
Sleep(400)
Send("{ENTER}")



Код:
WinWaitActive("OpenVPN 2.2.1  Setup ","Setup was completed successfully." )
Send("{ENTER}")
WinWaitActive("OpenVPN 2.2.1  Setup")
Send("{-}")
Sleep(500)
Send("{ENTER}")


BlockInput(0)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Решение нашёл такое - Отдельный скрипт скомпилировал в отдельный exeшник, который запускает основной скрипт. Но проблема в том что он продолжает висеть в трее. Мне не совсем нравится. Но надо доделать до обеда. Прошу подсказок и помощи.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
В дополнительный exe вставьте в начало скрипта:

Код:
#NoTrayIcon


и значка в трее не будет
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Данное сомнительное решение - cебя не оправдало. Ничего не получилось :( одновременно два скрипта у меня не открываются и не начинают работать. Воторой скрипт открывается после завершения первого. Ну а первый останавливается так как не расчитан на появление данного окна. Очень на вас надеюсь... Очень нужно сделать!

В краце: нужно сделать так чтобы скрипт припоявлении определенного окна выполнил действия, но если это окно не появляется. Продолжил свою работу.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
pashkovka
Попробуйте так
Код:
If WinExists("Безопасность Windows") Then ;если окно существует, тогда   
	WinActivate("Безопасность Windows") ;ставим его на передний план и что-то делаем с ним
	Sleep(400)
	Send("{TAB}")
	Sleep(400)
	Send("{TAB}")
	Sleep(400)
	Send("{TAB}")
	Sleep(400)
	Send("{ENTER}")
EndIf

на всех версиях Windows работать не будет,
на XP например имя этого окна другое
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
На Windows 7 - не работает :(
останавливается выполнение скрипта! :wacko:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
pashkovka
Покажите Summary Window Info
по окну безопасности

И еще, возможно окно безопасности не успело еще появиться
Тогда можно проверить
после
Код:
Run("C:\open\openvpn.exe")

поставить задержку
Код:
Sleep(1000)
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
нужно сделать так чтобы скрипт припоявлении определенного окна выполнил действия, но если это окно не появляется. Продолжил свою работу.
Код:
WinWait ( "title" [, "text" [, timeout]] )
;какое-то действие

или
Код:
WinWaitActive ( "title" [, "text" [, timeout]] )
;какое-то действие
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Окно безопасности выскакивает в другом месте. Я исправил. в начале темы.

Вот мой скрин



Добавлено:
Сообщение автоматически объединено:

Zaramot
Можно по подробней. А то я не пойму. Но по сути - Он какое то время ждёт а потом продолжает работу. Можно пример.
Yuriy
Всё ровно не работает! :(
 

AZJIO

Меценат
Меценат
Сообщения
2,756
Репутация
1,151
pashkovka
Зарегистрируй функцию AdlibRegister, которая каждые 0,1 сек проверяет существование ненужного окна и когда оно появляется, то тут же будет закрыто принудительно.

Код:
AdlibRegister('_Kill_OKHO', 100)

Func _Kill_OKHO()
	If WinExists('title') Then WinKill('title')
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Можно по подробней
Функция WinWait ждет появление окна, без того: активно оно или нет.
Функция WinWaitActive ждет когда окно будет активно.
Параметр timeout у этих функций, задает время сколько ждать (в секундах).

WinWait
WinWaitActive
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
Мне его не закрыть надо, а на жать кнопку установить!
Тем не менее полезно. Спасибо.


Добавлено:
Сообщение автоматически объединено:

Zaramot

Если я правильно понял то код должен выглядеть так:

Код:
#RequireAdmin
BlockInput(1)
Run("C:\open\openvpn.exe")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Welcome to the OpenVPN 2.2.1  Setup Wizard","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","License Agreement","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Components","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Install Location","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup ","Setup was completed successfully." )
Send("{ENTER}")
WinWaitActive("OpenVPN 2.2.1  Setup")
Send("{-}")


WinWait ( "Безопасность Windows" [, timeout 500]] )
    Sleep(400)
    Send("{TAB}")
    Sleep(400)
    Send("{TAB}")
    Sleep(400)
    Send("{TAB}")
    Sleep(400)
    Send("{ENTER}")



Sleep(500)
Send("{ENTER}")
Sleep(1000)
Run("C:\open\copy.bat")
Sleep(1000)
Run("C:\open\rrr.bat")
Sleep(2000)
Run("C:\open\off.bat")
Sleep(3000)
Run("C:\open\uuu.bat")
Sleep(3000)
FileDelete("C:\Users\Public\Desktop\OpenVPN GUI.lnk")
Sleep(1000)
BlockInput(0)
Run("C:\open\udkat.bat")


или же есть какая то ошибка в написании значения timeout ??

Так не работает. :(
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Примерно так:
Код:
#RequireAdmin
BlockInput(1)
Run("C:\open\openvpn.exe")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Welcome to the OpenVPN 2.2.1  Setup Wizard","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","License Agreement","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Components","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup")
ControlClick("OpenVPN 2.2.1  Setup","Choose Install Location","Button2")
WinWaitActive("OpenVPN 2.2.1  Setup ","Setup was completed successfully." )
Send("{ENTER}")
WinWaitActive("OpenVPN 2.2.1  Setup")
Send("{-}")


WinWait ( "Безопасность Windows", '', 500) ;ждем окно 500 секунд
	if WinExists('Безопасность Windows') Then ;Если окно есть, то...
		WinActivate('Безопасность Windows') ;Активируем окно и нажимаем кнопки. Если окна нет, то продолжаем с места X
		Sleep(400)
		Send("{TAB}")
		Sleep(400)
		Send("{TAB}")
		Sleep(400)
		Send("{TAB}")
		Sleep(400)
		Send("{ENTER}")
	EndIf



Sleep(500) ;Место X
Send("{ENTER}")
Sleep(1000)
Run("C:\open\copy.bat")
Sleep(1000)
Run("C:\open\rrr.bat")
Sleep(2000)
Run("C:\open\off.bat")
Sleep(3000)
Run("C:\open\uuu.bat")
Sleep(3000)
FileDelete("C:\Users\Public\Desktop\OpenVPN GUI.lnk")
Sleep(1000)
BlockInput(0)
Run("C:\open\udkat.bat")


PS 500 секунд, не много ли времени на ожидание окна ?
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
БЛИН! :( не хочет он на этом окне ничего нажимать. Что ещё можно предпринять?
 

AZJIO

Меценат
Меценат
Сообщения
2,756
Репутация
1,151
pashkovka
1. Вначале получите дескриптор окна, чтобы точно идентифицировать это окно и использовать его при вызове других оконных функций. Кроме того, если дескриптор не удалось получить, то все остальные операции также работать не будут, потому что ошибка изначально в неправильном идентифицировании окна.
2. Окно может потерять фокус активности, и ждать пока оно станет активным бесполезно. При использовании Send можно задействовать SendKeepActive для удержания окна активным перед отправкой в него данных.
3. Send можно заменить на ControlSend, чтобы отправлять высылку конкретному элементу или ControlClick вместо высылки "Enter"
При чём эти функции не требуют активации окна и можно использовать WinWait вместо WinWaitActive
4. Нажать три раза TAB
Код:
Send("{TAB 3}")

5. Вместо прямого пути C:\open использовать @ScriptDir (надеюсь скрипт со всеми делами лежит в папке)
6. Тогда не придётся блокировать клавиатуру... Ага, заблокировал и три часа ждём активации окна.
7. Читаем справку ;)
 
Автор
P

pashkovka

Новичок
Сообщения
18
Репутация
0
AZJIO
А если можно! Пример кода, со всеми добавками и изменениями. А то я не понял многое из написанного.
Читать всю справку, времени к сожелению нет. Обязательно прочту позже. Решение так и не нашёл!
:(Видимо придётся дать пользователю возможность нажать на кнопку, при появлении окна!
 
Верх