Что нового

UIAutomate - автоматизация нестандартных элементов GUI

liond66

Новичок
Сообщения
117
Репутация
2
Здравствуйте.
Результат функции
Код:
_UIA_ElementGetPropertyValue($оParrent, "ControlType")


выводится в числовом виде .
Как выводить название типа, вместо числового кода, не делая таблицу соответствий?
Спасибо.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
не делая таблицу соответствий
Я знаю два метода, позволяющих получить имена свойств и шаблонов по коду
Код:
#include <UIAutomate.au3>

Global $str, $obj = _UIA_ObjectCreate()

; имя свойства
$obj.GetPropertyProgrammaticName(30020, $str)
ConsoleWrite($str & @CRLF)

; имя шаблона
$obj.GetPatternProgrammaticName(10018, $str)
ConsoleWrite($str & @CRLF)
А методов, позволяющих получить строковое значение типа по его коду, я не нашёл.
 

liond66

Новичок
Сообщения
117
Репутация
2
Вместо указанных кодов я ввожу число 50000 (соответствует $UIA_ButtonControlTypeId)
и получаю пустое значение. Или я чего то не понимаю.
Все типы перечислены в файле UIAConstants.au3.
Не может быть что этим нельзя воспользоваться.
Т.е. вместо 50000 я хочу получить $UIA_ButtonControlTypeId
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
Или я чего то не понимаю
Или невнимательно читаете.
Метод GetPropertyProgrammaticName для получения имён свойств - коды от 30000 до 30167
Метод GetPatternProgrammaticName для получения имён шаблонов - коды от 10000 до 10033
А метода для преобразования кодов типов элементов (от 50000 до 50040) я не нашёл.

Не может быть что этим нельзя воспользоваться
Обратитесь в Microsoft. Если узнаете как - сообщите.
 

liond66

Новичок
Сообщения
117
Репутация
2
Теперь я понял: Вы имеете ввиду, что только две группы можно обработать этим методом.
А я имел ввиду, что в файле UIAConstants.au3 перечислены все коды и названия, почти таблица соответствий !
Как бы воспользоваться готовым файлом (списком), который уже в инклюде, для отображения типа по имени.
Спасибо за замечательную UDF !
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
liond66 [?]
Как бы воспользоваться готовым файлом (списком), который уже в инклюде, для отображения типа по имени.
Код:
$Code = 50000
$Name = StringRegExp(FileRead("UIAConstants.au3"), "\$UIA_(.*)ControlTypeId = " & $Code, 1)
$_ = IsArray($Name) ? ConsoleWrite($Name[0] & @CRLF) : ConsoleWrite("Undefined" & @CRLF)
 

liond66

Новичок
Сообщения
117
Репутация
2
Великолепно! Это то, что нужно.
Единственное, мне нужно полное имя, включая знак $, в переменную (не в консоль).
Поправьте пожалуйста.
Регулярные выражения - мистическая тема для меня ;).
Спасибо.
 

liond66

Новичок
Сообщения
117
Репутация
2
Всё, это точно то что нужно!
Спасибо, помогли.

Не могли бы Вы объяснить последнюю строчку? Как понимать здесь знак вопроса?
Я знаю только
Код:
If IsArray() Then
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
liond66 [?]
Не могли бы Вы объяснить последнюю строчку? Как понимать здесь знак вопроса?
Это называется "Тернарный условный оператор". Условие
Код:
$Name = IsArray($Name) ? $Name[0] : ""

Работает аналогично как условие
Код:
If IsArray($Name) Then
    $Name = $Name[0]
Else
    $Name = ""
EndIf
 

liond66

Новичок
Сообщения
117
Репутация
2
Здравствуйте.
Я скачал примеры на JavaFX на сайте Oracle.
Запускаю Ensemble.jar и код, который ниже.
Есть проблема с определением элементов в списке (TreeView) в левой части програмы.
По положению мыши _UIA_GetElementFromPoint элемент определяется всегда (получаю имя элемента).
И в то же время при запросе элемента через _UIA_FindAllElements по этому же имени не всегда элемент находится.
Зависит от того, где фокус. Например я подвожу мышку на элемент Animation (как в примере).
Если фокус на ветке, в которой есть Animation, то он видится.
Если фокус на паралельной ветке, то уже не видится через _UIA_FindAllElements.
Мне кажется не логичным, что при одинаковом состоянии GUI одна функция способна найти элемент, а другая нет.

Код:
#include <UIAutomate.au3>
Opt("MustDeclareVars", 1)
Opt("WinTitleMatchMode", 2)
Global $hWnd, $sHandle, $oParent, $aText, $oElement, $aPos, $ElName, $aCustomText, $NameType

$hWnd = WinWait("Ensemble", "")
$sHandle = WinGetHandle($hWnd)
$oParent = _UIA_GetElementFromHandle($sHandle)

Sleep(2000)
$aPos = MouseGetPos()
$oElement = _UIA_GetElementFromPoint($aPos[0], $aPos[1])
$ElName = _UIA_ElementGetPropertyValue($oElement, "Name")
If $ElName <> "" Then
    $NameType = "Name"
    ConsoleWrite($ElName & " Type: " & $NameType & @CRLF)
EndIf

$aCustomText = _UIA_FindAllElements($oParent, "Name", "Animation")
ConsoleWrite($aCustomText[0]& @CRLF)


Скачать Ensemble.jar можно здесь , внизу страницы JavaFX 2.0.2 Samples.
И чуть выше JavaFX 2.0.2 Runtime для запуска.
Спасибо.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429

liond66

Новичок
Сообщения
117
Репутация
2
Я был уверен, что если Inspect видит элементы, то с такой программой можно работать с помощью данной UDF.
И это подтверждает успешное распознование некоторыми функциями из данного пакета.
Только _UIA_FindAllElements работает по какому то другому алгоритму.
Мне кажется, что можно было бы подправить эту функцию, но решать конечно не мне.
Спасибо.
 
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
если Inspect видит элементы, то с такой программой можно работать с помощью данной UDF
Совершенно верно. Но Inspect "видит" элементы по разному. Когда вы выбираете элемент мышью, то вызывается метод ElementFromPoint, в ответ на который программа непосредственно создаёт объект-элемент. При вызове метода FindAll программа должна вернуть указатель на массив элементов-объектов, подходящих под условие, переданное параметром метода. А если происходит работа с деревом, то, в ответ на метод RawViewWalker, программа должна вернуть указатель на промежуточный объект-дерево. И всё вот это должен сделать программист, пишущий программу, путём реализации интерфейса сервера UIAutomation. А эта UDF всего лишь клиент UIAutomation. Поэтому, если программист в своей программе реализовал интерфейс не полностью, то в UDF будут работать, как вы правильно заметили, только некоторые функции.

Относительно программы Ensemble скажу следующее. Дерево примеров этой программы возвращает только первую ветвь (с дочерними пунктами, если ветвь раскрыта). И это вы можете увидеть в дереве элементов Inspect. Поэтому найти элемент дерева программы с именем Animation через FindAll вы сможете только, если нажмёте кнопку Samples над деревом. Тогда эта ветвь станет первой и, если её раскрыть, будут доступны все её дочерние пункты. Вот так реализована поддержка интерфейса UIAutomation конкретно в этой программе.
 
Последнее редактирование:

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо за разъяснения.
Единственное что я понял точно, что FindAll - не значит найти всё ;)
 

liond66

Новичок
Сообщения
117
Репутация
2
Здравствуйте InnI
Можно ли выполнять действия, доступные в Inspect-> Action ?
В частности интересует контролируемая вертикальная прокрутка по размеру листа, т.е. не MouseWheel, а Scroll.Scroll-> LargeIncrement или LargeDecrement.
Потому что кроме MouseClick и DoDefaultAction других действий я не нахожу.
Картинка Inspect прилагается.
Спасибо.
 

Вложения

  • Inspect.png
    Inspect.png
    207 КБ · Просмотры: 21
Автор
I

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Можно ли выполнять действия, доступные в Inspect-> Action ?
Можно. Причём, только их и можно выполнять. В этом меню находятся только возможные для конкретного элемента действия.
кроме MouseClick и DoDefaultAction других действий я не нахожу
Потому что их достаточно в 99% случаях и другие "действия", кроме ScrollIntoView, я просто не реализовывал.
Прокрутку можно делать кликая по стрелочке полосы или отправляя элементу PageDown.
интересует контролируемая вертикальная прокрутка по размеру листа, т.е. не MouseWheel, а Scroll.Scroll-> LargeIncrement или LargeDecrement
Код:
; Константы $ScrollAmount_* определены в UIAConstants.au3
$HorizontalAmount = $ScrollAmount_NoAmount
$VerticalAmount = $ScrollAmount_LargeIncrement

Local $pScroll, $oScroll
$oElement.GetCurrentPattern($UIA_ScrollPatternId, $pScroll)
$oScroll = ObjCreateInterface($pScroll, $sIID_IUIAutomationScrollPattern, $dtagIUIAutomationScrollPattern)
$oScroll.Scroll($HorizontalAmount, $VerticalAmount)
 

liond66

Новичок
Сообщения
117
Репутация
2
Спасибо, это работает. С благодарностью Лайк.
Правильно ли я понял: файл UIAConstants.au3 содержит все доступные действия с элементами?
Нужно только знать, как его использовать.
 
Верх