Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Перебор контролов (http://forum.oszone.net/showthread.php?t=149632)

w3d1 03-09-2009 09:14 1210223

Перебор контролов
 
Как можно перебрать все контролы в родительском окне и определить для них все данные? (Как в Window Info)
И еще, что для контролов будет неизменным (конкретно -поле для ввода) при каждом запуске приложения?
ID и Handle - меняется :(

amel27 03-09-2009 12:00 1210325

Цитата:

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

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

#Include <WinAPI.au3>
#Include <Array.au3>

$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 03-09-2009 12:47 1210362

А можно определить для контрола "Instance", "ClassnameNN", "Advanced (Class)", "Position", "Size", "Style", "ExStyle"?
В справке порылся, но что-то не нашел.

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

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

w3d1 03-09-2009 13:18 1210389

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

"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак :(

amel27 03-09-2009 14:58 1210462

Цитата:

Цитата w3d1
"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак »

- эти атрибуты производные от двух: "Instance" (он же NN) и "Classname";
- "Classname" возвращает _WinAPI_EnumWindowsEx() - индекс [$i][1];
- "Instance" - виртуальный атрибут, который получается по следующему алгоритму (ИМХО):

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

w3d1 03-09-2009 15:05 1210466

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

>>>> Control <<<<
Class: TEdit
Instance: 5
ClassnameNN: TEdit5
Advanced (Class): [CLASS:TEdit; INSTANCE:5]
ID: 723018
Text:
Position: 108, 144
Size: 321, 21
ControlClick Coords: 219, 5
Style: 0x540100C0
ExStyle: 0x00000200
Handle: 0x000B084A

>>>> Control <<<<
Class: TEdit
Instance: 6
ClassnameNN: TEdit6
Advanced (Class): [CLASS:TEdit; INSTANCE:6]
ID: 1706264
Text: 12345678
Position: 320, 116
Size: 109, 21
ControlClick Coords: 32, 16
Style: 0x540100C0
ExStyle: 0x00000200
Handle: 0x001A0918

ну и т.д.
Instance при перезапуске одинаковый, в отличие от Handle и ID

Вот как выдернуть из контрола Instance ? AWI же как-то определяет его.

Creat0R 04-09-2009 01:02 1210993

Цитата:

Цитата w3d1
(Как в Window Info) »

Вот нечто похожее.

w3d1 04-09-2009 06:58 1211090

Creat0R,
Спасибо!
Буду изучать.

amel27 04-09-2009 12:35 1211319

Цитата:

Цитата w3d1
как выдернуть из контрола Instance »

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

#include <WINAPI.au3>
#include <array.au3>

_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



Время: 03:42.

Время: 03:42.
© OSzone.net 2001-