Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
Случайные окна - все вопросы.

Аватара для semiono

Ветеран


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

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


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

Код: Выделить весь код
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, чтоб найти способы борьбы

-------
Полезное сообщение


Отправлено: 19:09, 21-02-2009

 

Аватара для semiono

Ветеран


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

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


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

Код: Выделить весь код
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") тоже неизвестно что из этого выйдет,
так как окно не всегда актуально...

-------
Полезное сообщение


Отправлено: 20:46, 21-02-2009 | #2



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

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


Googler


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

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


Цитата semiono:
Ведь окно 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:26, 24-02-2009 | #3


Аватара для semiono

Ветеран


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

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


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

-------
Полезное сообщение


Отправлено: 22:56, 24-02-2009 | #4


Googler


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

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


semiono

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

2. пример из справки:
Код: Выделить весь код
$var = FileSelectFolder("Choose a folder.", "")

Последний раз редактировалось amel27, 26-02-2009 в 04:07.

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

Отправлено: 06:06, 25-02-2009 | #5



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Info - IP - INFO [Все вопросы] gurWin Защита компьютерных систем 221 16-12-2010 14:02
Доступ - Никак не удаляются файлы (AVI и все остальные форматы) .:[все вопросы]:. Microsoft Windows 2000/XP 105 30-06-2010 11:58
Свернуть все окна (Shows Desktop)! Mirotvorez Microsoft Windows NT/2000/2003 4 05-01-2010 01:51
[решено] Определить все окна одной прграммы shyra1976 AutoIt 4 18-05-2009 09:07
Свернуть все окна с клавиатуры (в ноутбуке) shark21 Хочу все знать 4 24-12-2004 10:46




 
Переход