Что нового

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

vovsla

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

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

joiner

Модератор
Локальный модератор
Сообщения
3,409
Репутация
597
как вариант
Код:
;~ 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

Осваивающий
Сообщения
558
Репутация
26
как вариант
Код:
;~ 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,409
Репутация
597
нет, не правильно понял. именно окна стороннего ПО
 
Автор
V

vovsla

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

joiner

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

vovsla

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