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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как дождаться РЕАЛЬНОГО появления окна

Ответить
Настройки темы
Как дождаться РЕАЛЬНОГО появления окна

Новый участник


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

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


Здравствуйте!

Как дождаться РЕАЛЬНОГО появления окна, т.е. - его полной отрисовки?

Дело в том, что мне нужно поочерёдно открыть несколько окон, очерёдность эта строгая, т.е. на панели задач Windows окна должны располагаться в указанной последовательности. Но одно из окон (приложение) может долго загружаться, в итоге - AutoIt видит окно всеми возможными функциями (я все проверки уже перепробовал) и передаёт управление на запуск следующего окна (приложения), которое запускается гораздо быстрее и становится на панели задач первым, т.к. первое окно хоть и появилось для AutoIt, но реально не отрисовалось!

Паузы использовать не вариант, т.к. окно может запускаться и 2 и 3 и 10 секунд, в зависимости от загруженности системы и прочих составляющих.

ЗЫ: Не смог этот недостаток автоматизаторов побороть в nnCron, теперь не могу и в AutoIt (а он мне значительно больше нравится).

Спасибо.

Отправлено: 10:57, 29-12-2009

 

Аватара для kaster

Старожил


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

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


Попробуй
Код: Выделить весь код
WinWaitNotActive

-------
Русское сообщество пользователей AutoIt
autoit@conference.jabber.ru - Конференция на jabber.ru


Отправлено: 12:32, 29-12-2009 | #2



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

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


Новый участник


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

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


К сожалению, это тоже не работает

Отправлено: 12:58, 29-12-2009 | #3


Аватара для Creat0R

Must AutoIt


Moderator


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

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Последний раз редактировалось Creat0R, 30-12-2009 в 10:38.


Отправлено: 15:10, 29-12-2009 | #4


Аватара для Creat0R

Must AutoIt


Moderator


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

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 15:26, 29-12-2009 | #5


Новый участник


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

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


Moderator


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

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


Цитата NewOLDi:
громоздкий он конечно по самое не балуй »
Это далеко не громоздкий пример, есть намного хуже, и казалось бы для более простых задач.

Цитата NewOLDi:
Во многих оконных функциях AutoIt нельзя использовать в качестве заголовка отрывок текста »
Как раз совсем обратное верно - во всех оконных функциях можно использовать часть заголовка окна, за это отвечает Opt("WinTitleMatchMode", ...).

Цитата NewOLDi:
Или спасёт только [CLASS:MozillaWindowClass]? »
Это оптимальный вариант.

Цитата NewOLDi:
последнее не работает в твоём коде, Creat0R, только полный и точный заголовок окна »
Поправил.
Цитата NewOLDi:
Есть сторонние утилиты, которые располагают кнопки (запущенные приложения) на панели задач в нужной последовательности, т.е. Windows это позволяет. Вероятно, что и через AutoIt это можно как-то сделать. »
Можно вроде, это всего лишь кнопки, и их можно сдвинуть, но я бы не стал этого делать.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 10:30, 30-12-2009 | #7


Ветеран


Contributor


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

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


NewOLDi, Вы бы привели свой код, а то я что-то подозреваю, что дело не в AutoIt, а в особенностях конкретного приложения и в Вашем коде.

Отправлено: 12:34, 30-12-2009 | #8


Новый участник


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

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


Прошу прощения за длительное отсутствие...

Я всё-таки сам нашёл ПРОСТОЕ и ТОЧНОЕ решение по сабжу, ибо код от Creat0R слишком уж сильно выходит за все мыслимые пределы для такой элементарной задачи.

Итак, если нужно дождаться РЕАЛЬНОГО появления окна (РЕАЛЬНОЙ отрисовки окна) - использовать нужно следующий код:
Код: Выделить весь код
While NOT BitAND ( WinGetState ( 'title' ), 2 )
    Sleep ( delay )
WEnd
Я искренне верил, что должна быть в AutoIt встроенная штатная функция, которая способна решить сабж, ВЕДЬ ЭТО ТАК ОЧЕВИДНО! И она есть, вот только не сразу я её углядел, к сожалению.

Да, кстати... Благодарю за AutoItSetOption ( 'option', param ). Полезная фича, не знал

Спасибо!

Отправлено: 14:32, 25-01-2010 | #9


Аватара для Creat0R

Must AutoIt


Moderator


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

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


Цитата NewOLDi:
нашёл ПРОСТОЕ и ТОЧНОЕ решение по сабжу, ибо код от Creat0R слишком уж сильно выходит за все мыслимые пределы для такой элементарной задачи »
Я писал этот код исходя из вашего утверждения, что окно должно отрисоваться на панели задач. А найдены вами код проверяет окно на "видимость", т.е пока окно не имеет аттрибута "видимое", цикл продолжается.

Если вам нужно было вот такое простое решение, то и задачу нужно было по проще отрисовывать!

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community


Отправлено: 14:43, 25-01-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Как дождаться РЕАЛЬНОГО появления окна

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Получите поддержку по 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




 
Переход