Что нового

Как сделать ожидание окна без загрузки CPU?

vovsla

Осваивающий
Сообщения
607
Репутация
36
Для ожидания окна стороннего ПО использую команду "WinWait", при ожидании окна exeшник загружает процессор от 00 до 06.
При использовании вот такой конструкции
Код:
While Sleep(500)
    if (WinExists("Окно")) Then WinClose("Окно")
WEnd

загрузка процессора 00, но это решение мне кажется кривым.
Можно ли реализовать ожидание окна так чтобы во время ожидания не было загрузки процессора? Может можно отловить какое-то событие?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
как вариант
Код:
;~ autoit 3.3.14+
#NoTrayIcon
#include <WinAPISysWin.au3>
#include <APISysConstants.au3>

Global $g_hForm = GUICreate('') ; основное окно для регистрации хука.
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK')
_WinAPI_RegisterShellHookWindow($g_hForm)

While Sleep(10)
WEnd

Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg
    Local $sTitle
    Switch $hWnd
        Case $g_hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - открыто ' & @CRLF)
                Case $HSHELL_WINDOWDESTROYED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - закрыто' & @LF)
                Case $HSHELL_RUDEAPPACTIVATED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - активировано' & @LF)
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
как вариант
Код:
;~ autoit 3.3.14+
#NoTrayIcon
#include <WinAPISysWin.au3>
#include <APISysConstants.au3>

Global $g_hForm = GUICreate('') ; основное окно для регистрации хука.
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), 'WM_SHELLHOOK')
_WinAPI_RegisterShellHookWindow($g_hForm)

While Sleep(10)
WEnd

Func WM_SHELLHOOK($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg
    Local $sTitle
    Switch $hWnd
        Case $g_hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - открыто ' & @CRLF)
                Case $HSHELL_WINDOWDESTROYED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - закрыто' & @LF)
                Case $HSHELL_RUDEAPPACTIVATED
                    $sTitle = WinGetTitle($lParam)
                    If StringLen(StringStripWS($sTitle, 3)) Then ConsoleWrite($sTitle & ' - активировано' & @LF)
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_SHELLHOOK
Если я правильно понял, то это для собственного GUI, а мне нужно отловить появление окна стороннего ПО
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
нет, не правильно понял. именно окна стороннего ПО
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Где можно взять "WinAPISysWin.au3"?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Пользуюсь autoit 3.3.12.0
В нем нет этой библиотеки. Поэтому еще установлен autoit 3.3.15+, beta. Либо скачать актуальную версию языка
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Спасибо, работает. Нашел какие библиотеки можно использовать для версии 14
Код:
#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
 
Верх