$aData = _WinGetControls(WinGetHandle('Form1'))
For $i1=1 to $aData[0][0]
MsgBox(0,'',$aData[$i1][1] & $aData[$i1][2] )
Next
; #DEMOFUNCTION# ================================================================================================================
; Name...........: _WinGetControls
; Description ...: Liefert ein 2D-Array fur die Controls eines Fensters.
; Das Array enhalt fur jedes Control die folgenden Informationen:
; |[0] HWND - HWND des Controls
; |[1] Class - Klasse des Controls
; |[2] NN - ClassNN des Controls
; |[3] ID - ID des Controls
; |[4] Visible - Sichtbar? 1 = ja, 0 = nein
; Das Feld Array[0][0] enthalt die Anzahl der Controls.
; Syntax.........: _WinGetControls($hWnd)
; Parameters ....: $hWnd - HWND des Fensters (z.B. Ruckgabewert von GUICreate)
; Return values .: Erfolg: Controlarray
; Fehler: False, @error = 1
; Author ........: Gro?vater (www.autoit.de)
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; ===============================================================================================================================
Func _WinGetControls($hWnd)
Local $hCB
If Not IsHWnd($hWnd) Then Return SetError(1, 0, False)
__WinGetControlsAddControl("Init", 0)
$hCB = DLLCallbackRegister("__WinGetControlsAddControl", "Int", "HWND;LPARAM")
DllCall("User32.dll", "Int", "EnumChildWindows", "HWND", $hWnd, "Ptr", DllCallbackGetPtr($hCB), "LPARAM", $hWnd)
If @error Then Return SetError(DllCallbackFree($hCB), 0, False)
DllCallbackFree($hCB)
Return __WinGetControlsAddControl("Result", 0)
EndFunc
; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: __WinGetControlsAddControl
; Description ...: Callback-Funktion fur DLLCall "EnumChildWindows" in _WinGetControls
; Remarks .......: Weil ich globale Variable fur die Ruckgabe von Funktionswerten nicht mag und die Implementierung
; der statischen Arrays recht rudimentar ist, sind die maximale Anzahl von Controls auf 1024
; und die maximale Anzahl von Klassen auf 256 begrenzt.
; ===============================================================================================================================
Func __WinGetControlsAddControl($hWnd, $lParam)
Local Static $UControls = 1024
Local Static $UClasses = 256
Local Static $aControls[$UControls + 1][5]
Local Static $aClasses[$UClasses + 1][2]
Local $aResult, $C, $Class, $ClassExist, $ID, $NN
Switch $hWnd
Case "Init"
$aControls[0][0] = 0
$aClasses[0][0] = 0
Return
Case "Result"
$C = $aControls[0][0] + 1
$aResult = $aControls
Redim $aResult[$C][5]
Return $aResult
EndSwitch
$aResult = DllCall("User32.dll", "Int", "GetClassNameW", "HWND", $hWnd, "WStr", "", "Int", 260)
If @error Or $aResult[0] = 0 Then Return True
$Class = $aResult[2]
$aResult = DllCall("User32.dll", "Int", "GetDlgCtrlID", "HWND", $hWnd)
If @error Or $aResult[0] = 0 Then Return True
$ID = $aResult[0]
$ClassExist = False
$C = $aClasses[0][0]
For $I = 1 To $C
If $aClasses[$I][0] = $Class Then
$NN = $aClasses[$I][1] + 1
$aClasses[$I][1] = $NN
$ClassExist = True
ExitLoop
EndIf
Next
If Not $ClassExist Then
$NN = 1
$C += 1
If $C > $UClasses Then Return False
$aClasses[0][0] = $C
$aClasses[$C][0] = $Class
$aClasses[$C][1] = $NN
EndIf
$C = $aControls[0][0] + 1
If $C > $UControls Then Return False
$aControls[0][0] = $C
$aControls[$C][0] = $hWnd
$aControls[$C][1] = $Class
$aControls[$C][2] = $NN
$aControls[$C][3] = $ID
$aControls[$C][4] = ControlCommand(HWnd($lParam), "", $ID, "IsVisible", "")
Return True
EndFunc
; ===============================================================================================================================