Windows UIAutomation создание PropertyCondition

#c# #user-interface #automation

#c# #пользовательский интерфейс #автоматизация

Вопрос:

Я переношу некоторую автоматизацию пользовательского интерфейса из системы.Windows.API автоматизации к собственному API UIAutomationClient и столкнулся с тем, что кажется простой проблемой, но не может найти решение.

Мне нужно найти элементы пользовательского интерфейса, используя код в следующих строках:

 IUIAutomationElement namedElement = currentWindow.FindFirst(UIAutomationClient.TreeScope.TreeScope_Descendants, nameCondition);
  

Здесь объект nameCondition должен использовать условие IUIAutomation для сравнения имени элемента со строкой.

Используя старую систему.Windows.Автоматизация Я бы написал это как:

 PropertyCondition nameCondition = new PropertyCondition(AutomationElement.NameProperty, "name");
  

Однако я не могу понять, как использовать UIAutomation API для создания PropertyCondition. Единственные примеры, которые я видел, похоже, предполагают что-то в этом роде:

 IUIAutomationCondition nameCondition = cuiAutomation.CreatePropertyCondition(propertyIdName, "name");   
  

Здесь propertyIdName должно быть int, представляющим свойство NameProperty . Однако я не могу понять, как получить здесь правильный int. Я предполагаю, что он должен быть где-то в UIAutomation API как константа, но не могу его найти.

Ответ №1:

Я обнаружил следующую полезную страницу, в которой перечислены значения этих идентификаторов свойств: http://msdn.microsoft.com/en-us/library/windows/desktop/ee684017 (v= против 85).aspx

Например: UIA_AutomationIdPropertyId = 30011

Используя эту страницу, я определяю константы int в своем коде для идентификаторов свойств, которые мне нужно использовать. Я не думаю, что это может быть правильным ответом, но, по крайней мере, это позволяет мне добиться прогресса.

Ответ №2:

Не полный ответ, но я нашел значения в UIAutomationClient.UIA_PropertyIds . К сожалению, попытка получить к ним доступ непосредственно из вашего кода по-прежнему приводит к ошибке, но вы можете легко «Перейти к определению» для них, чтобы получить значения идентификаторов.

Ответ №3:

Я довольно долго работал с оболочкой IUIAutomation, доступной в виде пакета nuget для моего проекта .net core. есть несколько классов, в которых хранятся такие сведения, как идентификаторы свойств или ControlTypeIds. Рассматриваемый nuget является Interop .UIAutomationClient. Лично я не пытаюсь идти по пути записи фактического идентификатора, вместо этого я пытаюсь использовать его ссылку в коде. Пример может выглядеть примерно так:

 IUIAutomationCondition cond1 = CurrentWindow.CreatePropertyCondition(UIA_PropertyIds.UIA_ControlTypePropertyId, UIA_ControlTypeIds.UIA_EditControlTypeId);
IUIAutomationCondition cond2 = CurrentWindow.CreatePropertyCondition(UIA_PropertyIds.UIA_NamePropertyId, "File name:");
  

UIA_ControlTypeIds и UIA_PropertyIds будут классами, ссылающимися на идентификаторы для разных типов элементов управления и свойств. Я уверен, что в nuget доступно больше таких классов, но лично не было необходимости копаться дальше.