Показать полную графическую версию : Перебор контролов
Как можно перебрать все контролы в родительском окне и определить для них все данные? (Как в Window Info)
И еще, что для контролов будет неизменным (конкретно -поле для ввода) при каждом запуске приложения?
ID и Handle - меняется :(
Как можно перебрать все контролы в родительском окне и определить для них все данные? »ну, примерно так:
#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
А можно определить для контрола "Instance", "ClassnameNN", "Advanced (Class)", "Position", "Size", "Style", "ExStyle"?
В справке порылся, но что-то не нашел.
И еще - как отследить клик мыши на контроле?
К чему это все я - такая задача:
надо из текстовых полей одного приложения перебросить текст в текстовые поля другого приложения.
соответственно как-то нужно установить соответствие этих полей.
одно приложение (откуда) можно корректировать (дописать что надо или еще что), второе (куда) - может быть вообще любым, главное чтобы было установлено соответствие полей исходных и приемных.
перебрасывать текст получается (но пока только если руками задаю контролы), а по идее юзер сам должен установить что и куда перекидывать.
Позицию и размер нашел - ControlGetPos
"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак :(
"Instance", "ClassnameNN", "Advanced (Class)" найти не могу никак »
- эти атрибуты производные от двух: "Instance" (он же NN) и "Classname";
- "Classname" возвращает _WinAPI_EnumWindowsEx() - индекс [$i][1];
- "Instance" - виртуальный атрибут, который получается по следующему алгоритму (ИМХО):
все контролы одного класса индексируются по ID, порядковый номер и будет "Instance"
Вот есть у меня на форме несколько текстовых полей
>>>> 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 же как-то определяет его.
(Как в Window Info) »
Вот нечто похожее (http://forum.oszone.net/post-844021.html#post844021).
Creat0R,
Спасибо!
Буду изучать.
как выдернуть из контрола 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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.