Что нового

Обработка (закрытие, скрытие) окон через хуки - в чём ошибка (пример внутри)?

Ocago

Новичок
Сообщения
35
Репутация
0
Всем привет,
Не могу понять, в чём причина неадекватной работы функции? Окно по-идее должно быть невидимым, а оно мелькает-таки.
Вот примерчик:
Код:
#Include <WinAPIEx.au3>
#include <IE.au3>

Opt("WinTitleMatchMode", 2)
Opt("WinWaitDelay", 0) ;Delay open win
Opt('MustDeclareVars', 1)

Global $hForm
HotKeySet("{ESC}", "_Exit") ;Esc - выход по нажатию 
OnAutoItExitRegister('OnAutoItExit')

$hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '_ShellHookProc')

_WinAPI_RegisterShellHookWindow($hForm)

_WindOpen()

_Exit()

While 1
	Sleep(5)
WEnd

Func _ShellHookProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED
					WinSetState(WinGetTitle($lParam), "", @SW_HIDE)
            EndSwitch
    EndSwitch
EndFunc   ;==>_ShellHookProc

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($hForm)
EndFunc   ;==>OnAutoItExit

Func _Exit()
    _WinAPI_DeregisterShellHookWindow($hForm)
	Exit
EndFunc   ;==>_Exit

Func _WindOpen()
Local $oIE = _IECreate("http://yandex.ru/yandsearch?text=AutoIt&lr=39", 0, 1, 0)
Sleep(2000)
_IELinkClickByText ($oIE, "Example") 
Sleep(2000)
_IEQuit ($oIE)
WinClose(WinGetHandle("[CLASS:IEFrame]"))
EndFunc   ;==>_Exit


Функция _WindOpen() - чисто для примера (пара окон, второе попапом идёт). Понятно, что скрыть в неё окно браузера можно параметром в _IECreate (но, второе окно уже так не убрать просто уже).

Т.е. другими словами, хотелось-бы если @SW_HIDE указано, то окно абсолютно HIDE :smile: Если оно мелькает, значит что-то неправильно написано?

Что именно - подскажите, пожалуйста, кто рубит хорошо в WinAPI.
Всем спасибо и позитивные плюсы :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
WinAPI здесь непричем. Функция работает так, как и положено, а происходит следующее. В системе создается какое-нибудь окно, и только после этого посылается сообщение HSHELL_WINDOWCREATED. Т.е. не до создания окна, а уже после. Таким образом и получаются мелькания. Полностью запретить показ окон в AutoIt вряд-ли удасться сделать, да и на других языках придется попотеть.
 
Автор
O

Ocago

Новичок
Сообщения
35
Репутация
0
Грустная новость..
А по какому принципу,интересно, работает параметр $f_visible в _IECreate ?
Им ведь заранее задаётся параметр видимости окна.
Может быть отсюда зайти как-нибудь можно?

Либо в контейнере GUI открывать окна, но оттуда (в частности с IE именно) - новые окна будут "выскакивать" из контейнера всё равно :-\
Или таки можно заставить их открываться внутри контейнера каким-либо образом?
 
Верх