Что нового

[Элементы GUI] Помогите получить данные окна, пожалуйста!

roman-info01

Новичок
Сообщения
17
Репутация
0
Помогите советом, пожалуйста!!!

Слабо я разбираюсь в программировании, а задачу решить нужно.

Есть простая форма (она во вложении), на ней (кнопка TButton) и 3 компонента (TEdit)

Мне нужно перебрать все элементы и создать массив [x][y], где будет хранится, например
[Edit1]["ABC"]
[Edit2]["123"]
и.т.д

Начал писать:
Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>
; Получил в массив все элементы
$aData = _WinAPI_EnumChildWindows(WinGetHandle('Form1'),False)
; Перебираю все элементы
For $i=1 to $aData[0][0]
   ; Вот здесь мне нужно получить уникальное название и текст
   ; компонента Edit1, Edit2 и.т.д
Next

Проблема в том, что _WinAPI_EnumChildWindows выдает, например [2]|0x000201FA|TEdit, а мне нужно уникальный номер, ну TEdit1 и другие

Как быть дальше?
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
я не вижу вложения только скриншот
 
Автор
R

roman-info01

Новичок
Сообщения
17
Репутация
0
Я имел ввиду скриншот, извиняюсь


Добавлено:
Сообщение автоматически объединено:

Так никто не поможет?
 

joiner

Модератор
Локальный модератор
Сообщения
3 342
Репутация
576
Код:
#Include <Array.au3>
#Include <WinAPIEx.au3>
$aData = _WinAPI_EnumChildWindows(WinGetHandle('Form1'),1)
For $i=1 to $aData[0][0]
	MsgBox(0,'',$aData[$i][1])
Next
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
roman-info01

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
R

roman-info01

Новичок
Сообщения
17
Репутация
0
Александр, спасибо за ответ, но это совсем не то, что нужно - в массиве будут элементы TButton, TEdit, TEdit, TEdit, мне то нужно их имена, как в AutoIt Info - Button1, Edit1, Edit2 и.т.д
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
roman-info01
какая часть предупреждения не понятна? я попробую донести более доступно.
 

joiner

Модератор
Локальный модератор
Сообщения
3 342
Репутация
576
roman-info01
наверное вот оно самое ;)
на официальном форуме нашел. изменил пару символов
Код:
$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
; ===============================================================================================================================
 
Автор
R

roman-info01

Новичок
Сообщения
17
Репутация
0
Александр, спасибо Вам! Вопрос решен. Теперь буду разбираться в коде

Еще раз спасибо!
 
Верх