Что нового

Как скрыть форму и все дочерние формы?

Suppir

Продвинутый
Сообщения
967
Репутация
62
С помощью WinSetState ("", "", @SW_HIDE) я скрыл форму чужого приложения. Однако в этом приложении есть дочерние формы, которые остались видны. Можно ли скрыть сразу все дочерние формы приложения?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот здесь как раз и напрашивается рекурсия.

:smile:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Можно WinSetState применить в цикле с помощью массива или же просто подряд несколько раз указать эту команду на каждое окно.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
Попробуйте так:
Код:
#include <WinAPIEx.au3>

Local $sPID, $i, $sPath
Local $sFile = 'process.exe'
Local $iLen = StringLen($sFile)
Local $aList = WinList()

If IsArray($aList) Then
	For $i = 1 To UBound($aList) - 1
		If BitAND(WinGetState($aList[$i][1]), 2) Then
			$sPID = WinGetProcess($aList[$i][1])
			$sPath = _WinAPI_GetModuleFileNameEx($sPID)
			If StringRight($sPath, $iLen) = $sFile Then
				MsgBox(0, '', $sPath)
				;WinSetState($aList[$i][1], '', @SW_HIDE)
			EndIf
		EndIf
	Next
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Все намного проще.

Код:
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>

Opt('WinWaitDelay', 0)

_WinChildHide('Untitled - Notepad')

Func _WinChildHide($hOwner, $sText = '')

	$hOwner = WinGetHandle($hOwner, $sText)
	If Not $hOwner Then
		Return 0
	EndIf

	Local $aList = WinList()

	If IsArray($aList) Then
		For $i = 1 To $aList[0][0]
			If (BitAND(WinGetState($aList[$i][1]), 2)) And (_WinAPI_GetAncestor($aList[$i][1], $GA_ROOTOWNER) = $hOwner) Then
;				WinSetState($aList[$i][0], '', @SW_HIDE)
				ConsoleWrite($aList[$i][0] & @CR)
			EndIf
		Next
	EndIf
	Return 1
EndFunc   ;==>_WinChildHide
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Yashied
Странно, функция вроде бы срабатывает (возвращает единицу), но приложение не скрывается. Верней так, сама форма "открыть по номеру" скрывается с помощью SW_HIDE, но комбобокс остается видимым и мельтешит на экране.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
А так поизвращаться:

Код:
#Include <WindowsConstants.au3>
#Include <WinAPI.au3>

Opt('WinWaitDelay', 0)

_WinChildHide('Untitled - Notepad')

Func _WinChildHide($hOwner, $sText = '')
    $hOwner = WinGetHandle($hOwner, $sText)
	
    If Not $hOwner Then
        Return 0
    EndIf

    Local $aList = WinList()

    If IsArray($aList) Then
        For $i = 1 To $aList[0][0]
            If (BitAND(WinGetState($aList[$i][1]), 2)) And (_WinAPI_GetAncestor($aList[$i][1], $GA_ROOTOWNER) = $hOwner) Then
				$aClassList = StringSplit(_WinGetNumeratedClassList($aList[$i][1]), @CRLF, 1)
				
;~ 				WinSetState($aList[$i][0], '', @SW_HIDE)
                ConsoleWrite($aList[$i][0] & @CRLF & @TAB)
				
				For $j = 1 To $aClassList[0]
;~ 					ControlHide($aList[$i][1], '', $aClassList[$j])
					ConsoleWrite($aClassList[$j] & @CRLF)
					
					If $j < $aClassList[0] Then
						ConsoleWrite(@TAB)
					EndIf
				Next
            EndIf
        Next
    EndIf
    Return 1
EndFunc

Func _WinGetNumeratedClassList($sTitle, $sText="")
	Local $sClassList = WinGetClassList($sTitle, $sText)
	Local $aClassList = StringSplit(StringStripWS($sClassList, 3), @LF)
	Local $sRetClassList = "", $sHold_List = "|"
	Local $aiInHold, $iInHold
	
	For $i = 1 To UBound($aClassList) - 1
		If StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
			$aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
			$iInHold = Number($aiInHold[UBound($aiInHold)-1])
			
			If $iInHold = 0 Then $iInHold += 1
			
			$aClassList[$i] &= "~" & $iInHold + 1
			$sHold_List &= $aClassList[$i] & "|"
			
			$sRetClassList &= $aClassList[$i] & @CRLF
		Else
			$aClassList[$i] &= "~1"
			$sHold_List &= $aClassList[$i] & "|"
			$sRetClassList &= $aClassList[$i] & @CRLF
		EndIf
	Next
	
	Return StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc


?
:whistle:
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо, я чуть позже попробую, т.к. на сервере сейчас сижу и боюсь запускать этот скрипт :smile:
 
Верх