Войти

Показать полную графическую версию : Случайные окна - все вопросы.


semiono
21-02-2009, 19:09
Не могу понять вроде бы простую вещь, сначало я зделал так

ControlFocus("Select Destination Directory","","Edit1")
Sleep(100)
Send($VST & "\ChrisHeinBass")
ControlClick("Select Destination Directory","","Button1","left",1,37,11)
Sleep(100)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If WinExists("Install") Then
ControlClick("Install","","Button1","left",1,37,11)
; это окно реагирует на то, что целевая директория существует,
; с тупым вопросом - Are You Sure? Yes/No...
; В другом случае окно Install даже не появляется!
Sleep(100)
EndIf
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ControlClick("Choose Destination Location","","Button1","left",1,37,11)
Sleep(100)
Теперь у меня при разных ситуациях, при появлении окна Install и без него стал получаться баг.
Я начал думать в чём тут дело, и как мне показалось, что в блок If надо включить альтернативный ход

ControlFocus("Select Destination Directory","","Edit1")
Sleep(100)
Send($VST & "\ChrisHeinBass")
ControlClick("Select Destination Directory","","Button1","left",1,37,11)
Sleep(100)

If WinExists("Install") Then
ControlClick("Install","","Button1","left",1,37,11)
Sleep(100)
Else ; вот так!
ControlClick("Choose Destination Location","","Button1","left",1,37,11)
Sleep(100)
EndIf

Потом я подумал что если If не задействован в различных проходах, то наверное нехватает тогда снова следущего шага
ControlFocus("Select Destination Directory","","Edit1")
Sleep(100)
Send($VST & "\ChrisHeinBass")
ControlClick("Select Destination Directory","","Button1","left",1,37,11)
Sleep(100)

If WinExists("Install") Then
ControlClick("Install","","Button1","left",1,37,11)
Sleep(100)
Else
ControlClick("Choose Destination Location","","Button1","left",1,37,11)
Sleep(100)
EndIf
; добавил как и было
ControlClick("Choose Destination Location","","Button1","left",1,37,11)
Sleep(100)
Ни один вариант не получился универсальным! В чём тут проблема-то! :(
И как бы некогда зависать над этим, дело всё остальное ждёт.

ЗЫ Давайте тут поговорим об защите от всяких случайных pop-up windows, чтоб найти способы борьбы :)

semiono
21-02-2009, 20:46
Я нашёл одно экзотическое решение. Хотя поп-апы обычно и связанны с чеком директрий, так что думаю пойдётъ!

ControlFocus("Select Destination Directory","","Edit1")
Sleep(100)
Send($VST & "\ChrisHeinBass") ; здесь мы только выбираем путь,
; но не создаём, поэтому не известно есть ли там папки или нету!
ControlClick("Select Destination Directory","","Button1","left",1,37,11)
Sleep(100)

; здесь мы закрываем тупое окно
If FileExists($VST & "\ChrisHeinBass") Then
ControlClick("Install","","Button1","left",1,37,11)
Sleep(100)
EndIf

; и идём далше...
ControlClick("Choose Destination Location","","Button1","left",1,37,11)
Sleep(100)

Вдобавок я понял прежние свои ошибки:
If WinExists("Install") Then
Ведь окно Install не висит в ожидании, поэтому чекать его нет смысла,
а если добавить WinWaitActive("Install") тоже неизвестно что из этого выйдет,
так как окно не всегда актуально...

amel27
24-02-2009, 10:26
Ведь окно Install не висит в ожидании, поэтому чекать его нет смысла,
а если добавить WinWaitActive("Install") тоже неизвестно что из этого выйдет,
так как окно не всегда актуально... »
если есть возможность уникально идентифицировать ВСЕ окна мастера установки, то можно организовать выбор обработчика в одном рабочем цикле, вот два варианта, у каждого свои плюсы и минусы:

Вариант 1. (предпочтительный)
Идентифицируем текущее активное окно и запускаем нужный обработчик, порядок следования не важен, но пользователь или другой процесс не должны в процессе установки менять активное окно:
While 1
$sWinTitle = WinGetTitle("[active]") ; Заголовок активного окна
$sWinText = WinGetText("[active]") ; Текст активного окна

Select
Case $sWinTitle = "Select Destination Directory"
; код обработки окна 1
Case $sWinTitle = "Install"
; код обработки окна 2
Case $sWinTitle = "Choose Destination Location"
; код обработки окна 3
Case Else
ExitLoop
EndSelect

Sleep(500)
WEnd

Вариант 2.
Для каждого окна проверяем его наличие в системе, и при нахождении запускаем нужный обработчик. Порядок перебора обработчиков должен быть от дочерних - к родительским (родительские для дочерних существуют всегда). Необходимо обеспечить уникальность окон во всей системе, а не только среди окон мастера.
While 1
Select
Case WinExists("Choose Destination Location")
; код обработки окна 1
Case WinExists("Select Destination Directory")
; код обработки окна 2
Case WinExists("Install")
; код обработки окна 3
Case Else
ExitLoop
EndSelect

Sleep(500)
WEnd

semiono
24-02-2009, 22:56
Нужно пару моментов придумать, теперь видимо самому зделать добавочные окна, правда пока туго соображаю что самому надо...
Вообщем
1. Надо остановить скрипт, причём полностью до ожидания юзера. Например, управление происходит,
над обычным инсталлером, для автоматизации действий. Однако, для ввода альтернативного пути установки,
хотелось бы дать возможность юзеру нажать кнопку Browse... в инсталлере и ввести путь как обычно это бывает. Одним словом, надо остановить скрипт на окне, и дождаться действий пользователя. А потом продолжить работу скрипта. Желательно без ожидания по времени, а полный останов!
2. Это как бы попутный вопрос, как можно создать своё окно из AutoIt3, наподобие диалогов выбора пути
установки? То-есть, чтоб было скажем поле Edit для ввода пути, а лучше и кнопка Browse..., так как лень
бывает юзеру часто руками напбирать путь. Вообщем, чтоб из этого окна скрипт мог получить данные
в переменной которую далее можно уже использовать, для различных подстановок...

amel27
25-02-2009, 06:06
semiono

1. зависит от общего алгоритма, для приведенных выше примеров это соответствует пустому коду обработки окна типа Sleep(200), для стандартного ожидания можно использовать WinWaitClose()/WinWaitNotActive()

2. пример из справки: $var = FileSelectFolder("Choose a folder.", "")




© OSzone.net 2001-2012