Перебор контролов

Ответить
Аватара пользователя
w3d1

Перебор контролов

Сообщение w3d1 »

Как можно перебрать все контролы в родительском окне и определить для них все данные? (Как в Window Info)

И еще, что для контролов будет неизменным (конкретно -поле для ввода) при каждом запуске приложения?

ID и Handle - меняется Изображение
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

Цитата w3d1:



Как можно перебрать все контролы в родительском окне и определить для них все данные?
Перебор контролов




ну, примерно так:



Код:

Код: Выделить всё

#Include 
#Include 
$arr = _WinAPI_EnumWindowsEx(WinGetHandle(""))
_ArrayDisplay($arr)
Func _WinAPI_EnumWindowsEx($hWin, $fVisible = False)
    If Not(IsHWnd($hWin)) Then Return SetError(1)
    _WinAPI_EnumWindowsInit()
    _WinAPI_EnumWindowsChild($hWin, $fVisible)
    Local $aOUT[UBound($winapi_gaWinList)][4] = [["HWnd", "Class", "Control ID", "Control Text"]]
    For $i=1 To $winapi_gaWinList[0][0]
        $aOUT[$i][0] = $winapi_gaWinList[$i][0]
        $aOUT[$i][1] = $winapi_gaWinList[$i][1]
        $aOUT[$i][2] = Number(_WinAPI_GetDlgCtrlID($aOUT[$i][0]))
        $aOUT[$i][3] = ControlGetText($hWin,"","[ID:"& $aOUT[$i][2] &"]")
    Next
    Return $aOUT
EndFunc   ;==>_WinAPI_EnumWindowsEx
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

А можно определить для контрола "Instance", "ClassnameNN", "Advanced (Class)", "Position", "Size", "Style", "ExStyle"?

В справке порылся, но что-то не нашел.



И еще - как отследить клик мыши на контроле?



К чему это все я - такая задача:

надо из текстовых полей одного приложения перебросить текст в текстовые поля другого приложения.

соответственно как-то нужно установить соответствие этих полей.

одно приложение (откуда) можно корректировать (дописать что надо или еще что), второе (куда) - может быть вообще любым, главное чтобы было установлено соответствие полей исходных и приемных.

перебрасывать текст получается (но пока только если руками задаю контролы), а по идее юзер сам должен установить что и куда перекидывать.
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

Позицию и размер нашел - ControlGetPos



"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак Изображение
Аватара пользователя
amel27

Re: Перебор контролов

Сообщение amel27 »

Цитата w3d1:



"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак
Перебор контролов




- эти атрибуты производные от двух: "Instance" (он же NN) и "Classname";

- "Classname" возвращает _WinAPI_EnumWindowsEx() - индекс [$i][1];

- "Instance" - виртуальный атрибут, который получается по следующему алгоритму (ИМХО):



все контролы одного класса индексируются по ID, порядковый номер и будет "Instance"
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

Вот есть у меня на форме несколько текстовых полей



>>>> Control > Control
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

Creat0R,

Спасибо!

Буду изучать.
Аватара пользователя
w3d1

Re: Перебор контролов

Сообщение w3d1 »

Цитата w3d1:



как выдернуть из контрола Instance
Перебор контролов




ещё вариант перебора дочерних окон с использованием CallBack:



Код:

Код: Выделить всё

#include 
#include 
_EnumWindowsChildClass(WinGetHandle(""), "Scintilla")
_ArrayDisplay($a_EnumWindows)
Func _EnumWindowsChildClass($hWnd, $sClassName = "")
    Global $a_EnumWindows[1][5] = [["Class","NN","hWnd","ID","Text"]]
    Local $hCallBack  = DLLCallbackRegister("__EnumWindowsChildClassProc", "int", "hwnd;lparam")
    Local $tClassName = DllStructCreate("hwnd hWndMain;char ClassName[255]")
    Local $pClassName = DllStructGetPtr ($tClassName)
    Local $pCallBack  = DllCallbackGetPtr($hCallBack)
    DllStructSetData($tClassName, "hWndMain", $hWnd)
    DllStructSetData($tClassName, "ClassName", $sClassName)
    DllCall("user32.dll", "int", "EnumChildWindows", "hwnd", $hWnd, "ptr", $pCallBack, "lparam", $pClassName)
    DllCallbackFree($hCallBack)
EndFunc
Func __EnumWindowsChildClassProc($hWnd, $lParam)
    Local $tClassName = DllStructCreate("hwnd hWndMain;char ClassName[255]", $lParam)
    Local $sClassName = DllStructGetData($tClassName, "ClassName")
    Local $hWndMain   = DllStructGetData($tClassName, "hWndMain")
    Local $iUB = UBound($a_EnumWindows, 1), $iNN = 1
    If _WinAPI_IsClassName($hWnd, $sClassName) Then
        ReDim $a_EnumWindows[$iUB+1][5]
        $a_EnumWindows[$iUB][0] = _WinAPI_GetClassName($hWnd)
        If $iUB>1 And $a_EnumWindows[$iUB][0]=$a_EnumWindows[$iUB-1][0] Then $iNN=$a_EnumWindows[$iUB-1][1]+1
        $a_EnumWindows[$iUB][1] = $iNN
        $a_EnumWindows[$iUB][2] = $hWnd
        $a_EnumWindows[$iUB][3] = Number(_WinAPI_GetDlgCtrlID($hWnd))
        $a_EnumWindows[$iUB][4] = ControlGetText($hWndMain,"","[ID:"& $a_EnumWindows[$iNN][3] &"]")
    EndIf
    Return 1
EndFunc
Ответить

Вернуться в «AutoIt»