|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как дождаться РЕАЛЬНОГО появления окна |
|
|
Как дождаться РЕАЛЬНОГО появления окна
|
Новый участник Сообщения: 27 |
Профиль | Отправить PM | Цитировать Здравствуйте!
Как дождаться РЕАЛЬНОГО появления окна, т.е. - его полной отрисовки? Дело в том, что мне нужно поочерёдно открыть несколько окон, очерёдность эта строгая, т.е. на панели задач Windows окна должны располагаться в указанной последовательности. Но одно из окон (приложение) может долго загружаться, в итоге - AutoIt видит окно всеми возможными функциями (я все проверки уже перепробовал) и передаёт управление на запуск следующего окна (приложения), которое запускается гораздо быстрее и становится на панели задач первым, т.к. первое окно хоть и появилось для AutoIt, но реально не отрисовалось! Паузы использовать не вариант, т.к. окно может запускаться и 2 и 3 и 10 секунд, в зависимости от загруженности системы и прочих составляющих. ЗЫ: Не смог этот недостаток автоматизаторов побороть в nnCron, теперь не могу и в AutoIt (а он мне значительно больше нравится). Спасибо. |
|
Отправлено: 10:57, 29-12-2009 |
Старожил Сообщения: 367
|
Профиль | Отправить PM | Цитировать |
------- Отправлено: 12:32, 29-12-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 27
|
Профиль | Отправить PM | Цитировать К сожалению, это тоже не работает
|
Отправлено: 12:58, 29-12-2009 | #3 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Пример ожидания окна в панели задач:
#include <GUIToolbar.au3> $iRet = _WinWaitOnTaskBar("Some window text or Handle", "", 5) MsgBox(64, 'Return', $iRet) Func _WinWaitOnTaskBar($sTitle, $sText="", $iWait=0) Local $hWinWait = WinWait($sTitle, $sText, $iWait) If Not $hWinWait Then Return $hWinWait Local $hToolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322") Local $aWinList, $iToolbarButtonIndex, $iTimer = TimerInit() While 1 $aWinList = WinList() For $i = 0 To $aWinList[0][0] Step 1 If Not BitAND(WinGetState($aWinList[$i][1]), 2) Then ContinueLoop $iToolbarButtonIndex = _WinAPI_FindToolbarButton($aWinList[$i][1], $hToolbar) If $iToolbarButtonIndex > 0 And $aWinList[$i][1] = $hWinWait Then Return $aWinList[$i][1] Next If $iWait > 0 And TimerDiff($iTimer)/1000 >= $iWait Then Return 0 Sleep(10) WEnd Return 0 EndFunc Func _WinAPI_FindToolbarButton($hWnd, $hTB) Local $iReturn = -1, $iPID, $hProcess, $sStruct = DllStructCreate("ptr") ; open process owning toolbar control _WinAPI_GetWindowThreadProcessId($hTB, $iPID) $hProcess = _WinAPI_OpenProcess(0x410, False, $iPID) If $hProcess Then Local $iCount = _GUICtrlToolbar_ButtonCount($hTB) For $i = 0 To $iCount - 1 Local $iID = _GUICtrlToolbar_IndexToCommand($hTB, $i) ; button param is ptr to owner's window handle, stored in target process's memory space Local $dwData = _GUICtrlToolbar_GetButtonParam($hTB, $iID) ; read the window handle from the explorer process Local $aRet = DllCall("kernel32.dll", "int", "ReadProcessMemory", "ptr", _ $hProcess, "ptr", $dwData, "ptr", DllStructGetPtr($sStruct), "uint", 4, "uint*", 0) If $aRet[5] Then If $hWnd = DllStructGetData($sStruct, 1) Then $iReturn = $i ExitLoop EndIf EndIf Next _WinAPI_CloseHandle($hProcess) EndIf Return $iReturn EndFunc |
------- Последний раз редактировалось Creat0R, 30-12-2009 в 10:38. Отправлено: 15:10, 29-12-2009 | #4 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Вариант по проще, но не очень надёжный (в случае если на панели задач будут похожие по названию окна)...
#include <GUIToolbar.au3> $iRet = _WinWaitOnTaskBar("Some window text or Handle", 10) MsgBox(64, 'Return', $iRet) Func _WinWaitOnTaskBar($sTitle, $iWait=0) Local $hTaskBar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322") Local $iTimer = TimerInit() Local $iButton_Count, $sWin_Title If IsHWnd($sTitle) Then $sTitle = WinGetTitle($sTitle) While 1 $iButton_Count = _GUICtrlToolbar_ButtonCount($hTaskBar) For $i = 1 To $iButton_Count - 1 Step 2 $sWin_Title = _GUICtrlToolbar_GetButtonText($hTaskBar, _GUICtrlToolbar_IndexToCommand($hTaskBar, $i)) If WinGetTitle($sWin_Title) = $sTitle Then Return 1 Next If $iWait > 0 And TimerDiff($iTimer)/1000 >= $iWait Then Return 0 Sleep(10) WEnd Return 0 EndFunc |
|
------- Отправлено: 15:26, 29-12-2009 | #5 |
Новый участник Сообщения: 27
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
Странно, что такой весь из себя универсальный AutoIt не содержит специальных функций для лёгкого отслеживания реальных открытий окон (их полной отрисовки на экране), ведь архиполезная возможность, паузы (т.е. - пальцем в небо) тогда вообще не нужны во многих ситуациях! И ещё 2 вопроса по теме... 1: Во многих оконных функциях AutoIt нельзя использовать в качестве заголовка отрывок текста, ведь заголовок может быть всегда разным, но, в тоже время, всегда с одной и той же припиской (например: Google - Mozilla Firefox или Яндекс - Mozilla Firefox). Есть какая-то лёгкая возможность обходить этот недостаток (к примеру - шаблон, типа: *Mozilla Firefox)? Или спасёт только [CLASS:MozillaWindowClass]? Но последнее не работает в твоём коде, Creat0R, только полный и точный заголовок окна. 2: Есть сторонние утилиты, которые располагают кнопки (запущенные приложения) на панели задач в нужной последовательности, т.е. Windows это позволяет. Вероятно, что и через AutoIt это можно как-то сделать. Быть может это будет проще, нежели использовать огромный код от Creat0R? Ведь это тоже решение проблемы, хоть и не такое правильное, как хотелось бы изначально. Спасибо. |
|
Отправлено: 09:44, 30-12-2009 | #6 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата NewOLDi:
Цитата NewOLDi:
Цитата NewOLDi:
Цитата NewOLDi:
Цитата NewOLDi:
|
|||||
------- Отправлено: 10:30, 30-12-2009 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать NewOLDi, Вы бы привели свой код, а то я что-то подозреваю, что дело не в AutoIt, а в особенностях конкретного приложения и в Вашем коде.
|
Отправлено: 12:34, 30-12-2009 | #8 |
Новый участник Сообщения: 27
|
Профиль | Отправить PM | Цитировать Прошу прощения за длительное отсутствие...
Я всё-таки сам нашёл ПРОСТОЕ и ТОЧНОЕ решение по сабжу, ибо код от Creat0R слишком уж сильно выходит за все мыслимые пределы для такой элементарной задачи. Итак, если нужно дождаться РЕАЛЬНОГО появления окна (РЕАЛЬНОЙ отрисовки окна) - использовать нужно следующий код: Я искренне верил, что должна быть в AutoIt встроенная штатная функция, которая способна решить сабж, ВЕДЬ ЭТО ТАК ОЧЕВИДНО! И она есть, вот только не сразу я её углядел, к сожалению. Да, кстати... Благодарю за AutoItSetOption ( 'option', param ). Полезная фича, не знал Спасибо! |
Отправлено: 14:32, 25-01-2010 | #9 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата NewOLDi:
Если вам нужно было вот такое простое решение, то и задачу нужно было по проще отрисовывать! |
|
------- Отправлено: 14:43, 25-01-2010 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Получите поддержку по Windows 7 в режиме реального времени через Twitter аккаунт | OSZone News | Новости и события Microsoft | 0 | 16-10-2009 21:30 | |
Взять топовый комп, или дождаться Core i7? | Миф | Выбор отдельных компонентов компьютера и конфигурации в целом | 5 | 04-12-2008 22:26 | |
Тесты производительности с использованием реального ПО | Dirk Diggler | Программное обеспечение Windows | 1 | 17-05-2008 11:29 | |
[решено] Mathematica 4.2, как заставить дождаться конца установки? | rhiannon | Автоматическая установка приложений | 5 | 21-04-2005 07:51 | |
Момент появления чужого окна | SASHA 333 | Программирование и базы данных | 3 | 10-01-2005 14:22 |
|