Поделиться через


Кэширование свойств автоматизации пользовательского интерфейса и шаблонов элементов управления

При использовании службы автоматизации пользовательского интерфейса Майкрософт клиенты часто должны получать несколько свойств для нескольких элементов автоматизации. Клиент может получить отдельные свойства одного элемента за раз с помощью методов извлечения свойств, таких как IUIAutomationElement::CurrentName или CurrentAccessKey. Однако этот метод является медленным и неэффективным, так как он требует межпроцессного вызова для каждого извлекаемого свойства. Для повышения производительности клиенты могут использовать возможности автоматизации пользовательского интерфейса для кэширования (также известного как массовое извлечение). Кэширование позволяет клиенту извлекать все необходимые свойства для всех нужных элементов с помощью одного вызова метода. Затем клиент может получить отдельные свойства из кэша по мере необходимости и периодически получать новый моментальный снимок кэша, как правило, в ответ на события, которые регистрируют изменения в пользовательском интерфейсе.

Приложение может запрашивать кэширование при получении элемента автоматизации пользовательского интерфейса с помощью метода, например IUIAutomation::ElementFromPointBuildCache, IUIAutomationTreeWalker::GetFirstChildElementBuildCacheили IUIAutomationElement::FindFirstBuildCache.

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

В этом разделе содержатся следующие разделы.

Запросы кэша

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

Чтобы создать запрос кэша, начните с использования метода IUIAutomation::CreateCacheRequest для получения указателя интерфейса IUIAutomationCacheRequest. Затем настройте запрос кэша с помощью методов IUIAutomationCacheRequest.

Указание шаблонов свойств и элементов управления для кэширования

Можно указать свойства для кэширования, вызвав IUIAutomationCacheRequest::AddProperty. Вы можете указать шаблоны элементов управления для кэширования, вызвав IUIAutomationCacheRequest::AddPattern. Если шаблон элемента управления кэшируется, его свойства не кэшируются автоматически; Необходимо указать свойства, которые требуется кэшировать с помощью AddProperty.

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

Указание области и фильтрации запроса кэширования

Вы можете указать элементы, свойства которых и шаблоны элементов управления, которые нужно кэшировать, задав свойство IUIAutomationCacheRequest::TreeScope перед использованием запроса. Область действия зависит от элементов, извлекаемых методом, которому передается запрос кэша. Например, если задано только TreeScope_Children, а затем извлекается элемент автоматизации пользовательского интерфейса, свойства и шаблоны элементов управления дочерних элементов кэшируются, но свойства и шаблоны элементов управления самого элемента не кэшируются. Чтобы обеспечить кэширование для самого извлеченного элемента, необходимо включить TreeScope_Element в свойство IUIAutomationCacheRequest::TreeScope. Невозможно задать область для TreeScope_Parent или TreeScope_Ancestors. Однако родительский элемент можно кэшировать при кэшировании дочернего элемента; см. Получение кэшированных детей и родителей в этом разделе.

Степень кэширования также зависит от свойства IUIAutomationCacheRequest::TreeFilter. По умолчанию кэширование выполняется только для элементов, которые отображаются в представлении управления дерева автоматизации пользовательского интерфейса. Однако это свойство можно изменить, чтобы применить кэширование ко всем элементам или только к элементам, которые отображаются в представлении содержимого.

Сила ссылок на элементы

При получении элемента автоматизации по умолчанию у вас есть доступ ко всем свойствам и шаблонам элементов управления, включая эти свойства и шаблоны элементов управления, которые не кэшировались. Однако можно указать, что ссылка на элемент ссылается только на кэшированные данные, установив свойство IUIAutomationCacheRequest::AutomationElementMode, значение AutomationElementMode_None. В этом случае у вас нет доступа к некшированных свойствам и шаблонам управления извлеченных элементов. Это означает, что вы не можете получить доступ к текущим свойствам, таким как IUIAutomationElement::CurrentIsEnabled или получить шаблон элемента управления с помощью IUIAutomationElement::GetCurrentPattern. В кэшированных шаблонах элементов управления нельзя вызывать методы, выполняющие действия в элементе управления, например IUIAutomationInvokePattern::Invoke.

Пример приложения, которое может не нуждаться в полных ссылках на объекты, — средство чтения с экрана, которое может предварительно получить свойства имени и типа элемента управления в окне, не нуждаясь в самих объектах элемента автоматизации.

Получение кэшированных детей и родителей

При получении элемента автоматизации и запросе кэширования для дочерних элементов этого элемента через свойство IUIAutomationCacheRequest::TreeScope можно получить дочерние элементы, вызвав IUIAutomationElement::GetCachedChildren для полученного элемента.

Если TreeScope_Element был включен в область запроса кэша, корневой элемент запроса можно получить путем вызова IUIAutomationElement::GetCachedParent на любом из дочерних элементов.

Заметка

Вы не можете кэшировать родителей или предков корневого элемента запроса.

 

Получение нового снимка этого кэша

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

При подписке на событие с запросом кэша вы получите IUIAutomationElement новый снимок кэша в качестве источника события при вызове обработчика события. Вы также можете получить новый снимок кэшированных сведений для элемента, вызвав IUIAutomationElement::BuildUpdatedCache. Вы можете передать исходный IUIAutomationCacheRequest, чтобы получить новый снимок состояния всех сведений, которые ранее были закэшированы.

Получение нового моментального снимка кэша не изменяет свойства существующих ссылок IUIAutomationElement.

Примеры

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

концептуальные

Обзор шаблонов элементов управления для автоматизации пользовательского интерфейса

Получение элементов автоматизации пользовательского интерфейса

Обзор свойств автоматизации пользовательского интерфейса