Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перебор контролов

Ответить
Настройки темы
Перебор контролов

Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:14, 03-09-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата 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
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:00, 03-09-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Последний раз редактировалось w3d1, 03-09-2009 в 13:02.


Отправлено: 12:47, 03-09-2009 | #3


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось w3d1, 03-09-2009 в 13:55.


Отправлено: 13:18, 03-09-2009 | #4


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 14:58, 03-09-2009 | #5


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

>>>> 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 же как-то определяет его.

Отправлено: 15:05, 03-09-2009 | #6


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата w3d1:
(Как в Window Info) »
Вот нечто похожее.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:02, 04-09-2009 | #7


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 06:58, 04-09-2009 | #8


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата 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

Отправлено: 12:35, 04-09-2009 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перебор контролов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Перебор пользователей с рабочей станции. И их блокировка. fat_cat Microsoft Windows NT/2000/2003 5 19-03-2009 01:51
Перебор в твиках! lmn Автоматическая установка Windows 2000/XP/2003 2 30-07-2005 02:47
Java - виджеты контролов в Java Metamorph Программирование и базы данных 2 03-08-2004 01:28
Как на Perl'е написать перебор символов?? JS Программирование и базы данных 2 16-10-2003 09:03




 
Переход