Показать полную графическую версию : Как дождаться РЕАЛЬНОГО появления окна
Здравствуйте!
Как дождаться РЕАЛЬНОГО появления окна, т.е. - его полной отрисовки?
Дело в том, что мне нужно поочерёдно открыть несколько окон, очерёдность эта строгая, т.е. на панели задач Windows окна должны располагаться в указанной последовательности. Но одно из окон (приложение) может долго загружаться, в итоге - AutoIt видит окно всеми возможными функциями (я все проверки уже перепробовал) и передаёт управление на запуск следующего окна (приложения), которое запускается гораздо быстрее и становится на панели задач первым, т.к. первое окно хоть и появилось для AutoIt, но реально не отрисовалось!
Паузы использовать не вариант, т.к. окно может запускаться и 2 и 3 и 10 секунд, в зависимости от загруженности системы и прочих составляющих.
ЗЫ: Не смог этот недостаток автоматизаторов побороть в nnCron, теперь не могу и в AutoIt (а он мне значительно больше нравится).
Спасибо.
Попробуй
WinWaitNotActive
К сожалению, это тоже не работает :(
Пример ожидания окна в панели задач:
#include <GUIToolbar.au3>
$iRet = _WinWaitOnTaskBar("Some window text or Handle", "", 5)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, 'Return', $iRet)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _WinWaitOnTaskBar($sTitle, $sText="", $iWait=0)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hWinWait = WinWait (http://www.autoitscript.com/autoit3/docs/functions/WinWait.htm)($sTitle, $sText, $iWait)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) $hWinWait Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $hWinWait
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hToolbar = ControlGetHandle (http://www.autoitscript.com/autoit3/docs/functions/ControlGetHandle.htm)("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aWinList, $iToolbarButtonIndex, $iTimer = TimerInit (http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm)()
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$aWinList = WinList (http://www.autoitscript.com/autoit3/docs/functions/WinList.htm)()
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aWinList[0][0] Step (http://www.autoitscript.com/autoit3/docs/keywords.htm#Step) 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)(WinGetState (http://www.autoitscript.com/autoit3/docs/functions/WinGetState.htm)($aWinList[$i][1]), 2) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
$iToolbarButtonIndex = _WinAPI_FindToolbarButton($aWinList[$i][1], $hToolbar)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iToolbarButtonIndex > 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) $aWinList[$i][1] = $hWinWait Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aWinList[$i][1]
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iWait > 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) TimerDiff (http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm)($iTimer)/1000 >= $iWait Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(10)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _WinAPI_FindToolbarButton($hWnd, $hTB)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iReturn = -1, $iPID, $hProcess, $sStruct = DllStructCreate (http://www.autoitscript.com/autoit3/docs/functions/DllStructCreate.htm)("ptr")
; open process owning toolbar control
_WinAPI_GetWindowThreadProcessId($hTB, $iPID)
$hProcess = _WinAPI_OpenProcess(0x410, False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False), $iPID)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hProcess Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iCount = _GUICtrlToolbar_ButtonCount($hTB)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 0 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iCount - 1
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iID = _GUICtrlToolbar_IndexToCommand($hTB, $i)
; button param is ptr to owner's window handle, stored in target process's memory space
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $dwData = _GUICtrlToolbar_GetButtonParam($hTB, $iID)
; read the window handle from the explorer process
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aRet = DllCall (http://www.autoitscript.com/autoit3/docs/functions/DllCall.htm)("kernel32.dll", "int", "ReadProcessMemory", "ptr", _
$hProcess, "ptr", $dwData, "ptr", DllStructGetPtr (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetPtr.htm)($sStruct), "uint", 4, "uint*", 0)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aRet[5] Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hWnd = DllStructGetData (http://www.autoitscript.com/autoit3/docs/functions/DllStructGetData.htm)($sStruct, 1) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iReturn = $i
ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
_WinAPI_CloseHandle($hProcess)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $iReturn
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Вариант по проще, но не очень надёжный (в случае если на панели задач будут похожие по названию окна)...
#include <GUIToolbar.au3>
$iRet = _WinWaitOnTaskBar("Some window text or Handle", 10)
MsgBox (http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm)(64, 'Return', $iRet)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _WinWaitOnTaskBar($sTitle, $iWait=0)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $hTaskBar = ControlGetHandle (http://www.autoitscript.com/autoit3/docs/functions/ControlGetHandle.htm)("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iTimer = TimerInit (http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm)()
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iButton_Count, $sWin_Title
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) IsHWnd (http://www.autoitscript.com/autoit3/docs/functions/IsHWnd.htm)($sTitle) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) $sTitle = WinGetTitle (http://www.autoitscript.com/autoit3/docs/functions/WinGetTitle.htm)($sTitle)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
$iButton_Count = _GUICtrlToolbar_ButtonCount($hTaskBar)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $iButton_Count - 1 Step (http://www.autoitscript.com/autoit3/docs/keywords.htm#Step) 2
$sWin_Title = _GUICtrlToolbar_GetButtonText($hTaskBar, _GUICtrlToolbar_IndexToCommand($hTaskBar, $i))
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) WinGetTitle (http://www.autoitscript.com/autoit3/docs/functions/WinGetTitle.htm)($sWin_Title) = $sTitle Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 1
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iWait > 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) TimerDiff (http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm)($iTimer)/1000 >= $iWait Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(10)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
Пример ожидания окна в панели задач: »
Спасибо, код работает. Но громоздкий он конечно по самое не балуй.
Странно, что такой весь из себя универсальный AutoIt не содержит специальных функций для лёгкого отслеживания реальных открытий окон (их полной отрисовки на экране), ведь архиполезная возможность, паузы (т.е. - пальцем в небо) тогда вообще не нужны во многих ситуациях!
И ещё 2 вопроса по теме...
1:
Во многих оконных функциях AutoIt нельзя использовать в качестве заголовка отрывок текста, ведь заголовок может быть всегда разным, но, в тоже время, всегда с одной и той же припиской (например: Google - Mozilla Firefox или Яндекс - Mozilla Firefox). Есть какая-то лёгкая возможность обходить этот недостаток (к примеру - шаблон, типа: *Mozilla Firefox)? Или спасёт только [CLASS:MozillaWindowClass]? Но последнее не работает в твоём коде, Creat0R, только полный и точный заголовок окна.
2:
Есть сторонние утилиты, которые располагают кнопки (запущенные приложения) на панели задач в нужной последовательности, т.е. Windows это позволяет. Вероятно, что и через AutoIt это можно как-то сделать. Быть может это будет проще, нежели использовать огромный код от Creat0R? Ведь это тоже решение проблемы, хоть и не такое правильное, как хотелось бы изначально.
Спасибо.
громоздкий он конечно по самое не балуй »
:o Это далеко не громоздкий пример, есть намного хуже, и казалось бы для более простых задач.
Во многих оконных функциях AutoIt нельзя использовать в качестве заголовка отрывок текста »
Как раз совсем обратное верно - во всех оконных функциях можно использовать часть заголовка окна, за это отвечает Opt("WinTitleMatchMode", ...).
Или спасёт только [CLASS:MozillaWindowClass]? »
Это оптимальный вариант.
последнее не работает в твоём коде, Creat0R, только полный и точный заголовок окна »
Поправил.Есть сторонние утилиты, которые располагают кнопки (запущенные приложения) на панели задач в нужной последовательности, т.е. Windows это позволяет. Вероятно, что и через AutoIt это можно как-то сделать. »
Можно вроде, это всего лишь кнопки, и их можно сдвинуть, но я бы не стал этого делать.
NewOLDi, Вы бы привели свой код, а то я что-то подозреваю, что дело не в AutoIt, а в особенностях конкретного приложения и в Вашем коде.
Прошу прощения за длительное отсутствие...
Я всё-таки сам нашёл ПРОСТОЕ и ТОЧНОЕ решение по сабжу, ибо код от Creat0R слишком уж сильно выходит за все мыслимые пределы для такой элементарной задачи.
Итак, если нужно дождаться РЕАЛЬНОГО появления окна (РЕАЛЬНОЙ отрисовки окна) - использовать нужно следующий код:
While NOT BitAND ( WinGetState ( 'title' ), 2 )
Sleep ( delay )
WEnd
Я искренне верил, что должна быть в AutoIt встроенная штатная функция, которая способна решить сабж, ВЕДЬ ЭТО ТАК ОЧЕВИДНО! И она есть, вот только не сразу я её углядел, к сожалению.
Да, кстати... Благодарю за AutoItSetOption ( 'option', param ). Полезная фича, не знал :)
Спасибо!
нашёл ПРОСТОЕ и ТОЧНОЕ решение по сабжу, ибо код от Creat0R слишком уж сильно выходит за все мыслимые пределы для такой элементарной задачи »
Я писал этот код исходя из вашего утверждения, что окно должно отрисоваться на панели задач. А найдены вами код проверяет окно на "видимость", т.е пока окно не имеет аттрибута "видимое", цикл продолжается.
Если вам нужно было вот такое простое решение, то и задачу нужно было по проще отрисовывать!
Как дождаться РЕАЛЬНОГО появления окна, т.е. - его полной отрисовки?
Куда уж проще :)
Про панель задач - это чтобы задача была ясна наверняка (на все 200%)..
Куда уж проще »
«Как дождаться появление окна, т.е его видимости на экране.»
Про панель задач - это чтобы задача была ясна наверняка »
Ну вот как раз этим то задача и была немного сбита с пути.
SharkyEXE
03-11-2019, 12:13
Всем здравствуйте.
Скажите, пожалуйста, а как дождаться появления, полной загрузки рабочего стола (признаки полной загрузки рабочего стола для меня - это появление на рабочем столе значков, отображение панели задач, отображение часов в панели задач и т.д.)
То есть мне что требуется - если загружен рабочи стол - то выполняем комманды
Команда 1
Команда 2
Команда 3
...
Если не загружен рабочий стол - то пауза, ждем, когда будет загружен рабочий стол, тогда и будем выполнять комманды
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC