Что нового

Как в этих условиях поймать момент закрытия окна, чтобы продолжить скрипт?

Researcher

Новичок
Сообщения
11
Репутация
0
Здравствуй, уважаемое Сообщество!
Суть проблемы: Управляемая программа открывает дочернее окно в модальном режиме, отображает в этом окне процесс работы, и меняет текстовую информацию в его заголовке.
Окно может отображаться неопределенное время. Window Info хендл этого окна не показывает.
Как в этих условиях поймать момент закрытия окна, чтобы продолжить скрипт?

Извините, если тема уже была – искал, но не нашел.
Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Researcher [?]
Window Info хендл этого окна не показывает
А что показывает? Сводную информацию с вкладки Summary можете предоставить? Да и снимок окна хорошо бы увидеть...
 
Автор
R

Researcher

Новичок
Сообщения
11
Репутация
0
Если точнее, то я изучаю AutoIt на примере управления архиватором WinRar.
Когда начинается процесс архивации, то появляется окно, показанное на рисунке.
Если создается многотомный архив, то заголовок у окна постоянно меняется.
Window Info видит только элементы управления окна, а само окно он воспринимает как главное окно WinRar, хотя это не оно.

Вот содержимое Summary
>>>> Window <<<<
Title: D:\ - WinRAR
Class: WinRarWindow
Position: -9, -9
Size: 1618, 882
Style: 0x17CF0000
ExStyle: 0x00000100
Handle: 0x002303C0

>>>> Control <<<<
Class: Button
Instance: 1
ClassnameNN: Button1
Name:
Advanced (Class): [CLASS:Button; INSTANCE:1]
ID: 65535
Text:
Position: 511, 287
Size: 418, 92
ControlClick Coords: 162, 88
Style: 0x50000007
ExStyle: 0x00000004
Handle: 0x003906BC

>>>> Mouse <<<<
Position: 673, 425
Cursor ID: 0
Color: 0xF0F0F0

>>>> StatusBar <<<<
1:
2: Выбрано: 1 папка
3: Всего: 6 папок

>>>> ToolsBar <<<<

>>>> Visible Text <<<<
Создание архива Film 5.rar
Добавление
Image19.jpg
41%
Прошло времени:
Примерно осталось:
31%
00:00:08
00:00:18
&Фоновый режим
&Пауза
Отмена
Справка
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
$wnd = ControlGetHandle("[class:WinRarWindow]", "", "#327701")
WinWaitClose($wnd)
 
Автор
R

Researcher

Новичок
Сообщения
11
Репутация
0
Не помогло.
Скрипт игнорирует команду WinWaitClose и идет дальше, хотя запаковка еще не завершена.
Может это как-то связано с Vista?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Researcher
Может лучше отслеживать завершение процесса WinRar?
Код:
ProcessWaitClose()
 
Автор
R

Researcher

Новичок
Сообщения
11
Репутация
0
Старая, 3.51. В целом он управляем, затык только с этим моментом.

Весь WinRar закрывать не нужно, нужно дождаться, когда он закончит архивацию, и продолжить работу с его окнами.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Researcher
Проверил на 3.50 - нормально работает.
У вас, когда эти строки выполняются, окно-то на экране есть? Может его ещё нет, а вы уже его закрытия ожидаете? Попробуйте так
Код:
; ожидание появления окна
While Not ControlCommand("[class:WinRarWindow]", "", "#327701", "IsVisible")
  Sleep(100)
WEnd
; ожидание закрытия окна
WinWaitClose(ControlGetHandle("[class:WinRarWindow]", "", "#327701"))
 
Автор
R

Researcher

Новичок
Сообщения
11
Репутация
0
Да, действительно.
Лопухнулся с ожиданием открытия.
Спасибо большое.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Researcher [?]
Window Info хендл этого окна не показывает
Есть альтернативы, которые показывают
http://autoit-script.ru/index.php?topic=4579.0
http://autoit-script.ru/index.php?topic=14400.0
 
Автор
R

Researcher

Новичок
Сообщения
11
Репутация
0
Спасибо за ссылки.
Однако я хотел бы дополнить Ваше решение.
Практика показала, что существуют такие комбинации параметров WinRar, при которых окно прогресса живет на экране настолько мало, что даже если совсем убрать задержку из Вашего цикла, то даже в этом случае окно проскакивает между строчек скрипта и не ловится.
Поэтому я объединил Ваш код с кодом слежения за размером целевой папки. Таким образом, если архивация завершилась очень быстро, то об этом свидетельствует прекращение изменения размера папки, а если процесс архивации идет трудно и прирост размера не произошел, то об этом говорит наличие окна прогресса.

Код:
$dirSize1=DirGetSize ($arhDir)
; …. Запуск процесса запаковки

; Ожидание завершения запаковки
While 1
   Sleep(500)
   $dirSize2=DirGetSize ($arhDir)
   If ($dirSize1=$dirSize2) And Not ControlCommand("[class:WinRarWindow]", "", "#327701", "IsVisible") Then ExitLoop
   $dirSize1=$dirSize2
WEnd

Данное решение стабильно работало в течение часа тестирования архиватора при различных параметрах (потом мне надоело :smile:)
 
Верх