AutomationElement: кешированный элемент (через GetCachedChildren) для живого элемента

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

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

Здесь возникает проблема: у меня есть правильный индекс, который я хочу, у меня также есть кешированный элемент автоматизации, но, поскольку я указал AutomationElementMode.None в CacheRequest (мне все еще нужно проверить, влияет ли это на производительность), я, кажется, не способен преобразовать кэшированный элемент в тот, который я могу использовать для будущих вызовов («живой» элемент).

Пробовал конвертировать через NativeWindowHandle (так как есть функция AutomationElement.FromWindowHandle), но дескриптор вроде бы 0, так что никак.

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

У меня есть дочерний индекс, я могу получить все значения, которые могу кэшировать - как я могу получить рабочий/живой элемент автоматизации кэшированного элемента?

Спасибо, Андреас.

(используя С# в Windows 7 64 с приложением win32 (в качестве цели автоматизации), хотя это не должно иметь большого значения)


person Andreas Reiff    schedule 09.02.2012    source источник


Ответы (2)


У вас есть дочерний текст, который вам нужен в дополнение к индексу? Если да, можно ли отправить дочерний текст в поле со списком, как если бы пользователь печатал, чтобы выбрать нужный вам дочерний элемент, вместо того, чтобы пытаться получить элемент автоматизации?

Всегда есть IUIAutomationLegacyIAccessiblePattern, к которому можно вернуться, но я думаю, что это только в основном API, а не в клиенте (AutomationElement).

person chrismead    schedule 05.06.2012
comment
Спасибо за Ваш ответ! Как вы получаете этот интерфейс? Есть ли преобразование из UIAtuomation в объект, реализующий этот интерфейс? - person Andreas Reiff; 09.08.2012
comment
Да, но только с использованием неуправляемого API, что, на мой взгляд, лучше. Подробнее читайте здесь: социальный. msdn.microsoft.com/Forums/en-US/ (насколько я могу судить, IUIAutomationLegacyIAccessiblePattern не является частью управляемого кода). Дайте мне знать, если вы хотите попробовать неуправляемый, и я могу добавить к моему ответу. - person chrismead; 09.08.2012

На самом деле, использование AutomationElementMode.None кажется не лучшей идеей. Время, которое занимает запрос кеша, по-видимому, лишь незначительно зависит от того, запрашиваете ли вы живой элемент и сколько свойств вы запрашиваете. (Поправьте меня, если я ошибаюсь - я не тестировал систематически, но недавно почувствовал это, играя с некоторыми параметрами моего запроса кеша.)

Похоже, что в первую очередь на это влияет количество элементов пользовательского интерфейса, которые вы запрашиваете в первую очередь.

Так что я мог запросить живую ссылку в первую очередь.

Это заставляет меня задаться вопросом, будет ли доступ через какую-либо функцию Win32SDK быстрее.

person Andreas Reiff    schedule 09.08.2012