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


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

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

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

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

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

Запросы кэша

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

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

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

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

Вы можете получить свойство шаблона элемента управления (например, свойство Value шаблона элемента управления 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 для любого из дочерних элементов.

Примечание

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

 

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

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

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

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

Примеры

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

Основные понятия

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

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

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