Mise en cache des propriétés UI Automation et des modèles de contrôle

Lors de l’utilisation de Microsoft UI Automation, les clients doivent souvent récupérer plusieurs propriétés pour plusieurs éléments d’automatisation. Un client peut récupérer des propriétés individuelles un élément à la fois à l’aide des méthodes de récupération de propriété telles que IUIAutomationElement::CurrentName ou CurrentAccessKey. Toutefois, cette méthode est lente et inefficace, car elle nécessite un appel interprocesseur pour chaque propriété récupérée. Pour améliorer les performances, les clients peuvent utiliser les fonctionnalités de mise en cache (également appelées extraction en bloc) de UI Automation. La mise en cache permet à un client de récupérer toutes les propriétés souhaitées pour tous les éléments souhaités avec un seul appel de méthode. Le client peut ensuite récupérer les propriétés individuelles du cache en fonction des besoins et peut obtenir régulièrement une nouvelle instantané du cache, généralement en réponse aux événements qui signifient des modifications dans l’interface utilisateur.

L’application peut demander la mise en cache lorsqu’elle récupère un élément UI Automation à l’aide d’une méthode, telle que IUIAutomation::ElementFromPointBuildCache, IUIAutomationTreeWalker::GetFirstChildElementBuildCache ou IUIAutomationElement::FindFirstBuildCache.

La mise en cache se produit également lorsque vous spécifiez une demande de cache lors de l’abonnement à des événements. L’élément UI Automation passé à votre gestionnaire d’événements en tant que source d’un événement contient les propriétés mises en cache et les modèles de contrôle spécifiés par la demande de cache. Toutes les modifications apportées à la demande de cache après vous être abonné à l’événement n’ont aucun effet.

Cette rubrique contient les sections suivantes.

Demandes de cache

La mise en cache consiste à déterminer les propriétés à récupérer et les éléments à partir desquels les récupérer, puis à utiliser ces informations pour créer une demande de cache. Chaque fois que le client obtient une interface IUIAutomationElement pour l’élément d’interface utilisateur, UI Automation met en cache les informations spécifiées dans la demande de cache.

Pour créer une demande de cache, commencez par utiliser la méthode IUIAutomation::CreateCacheRequest pour récupérer un pointeur d’interface IUIAutomationCacheRequest . Ensuite, configurez la demande de cache à l’aide des méthodes de IUIAutomationCacheRequest.

Spécification des modèles de propriété et de contrôle à mettre en cache

Vous pouvez spécifier les propriétés à mettre en cache en appelant IUIAutomationCacheRequest::AddProperty. Vous pouvez spécifier des modèles de contrôle à mettre en cache en appelant IUIAutomationCacheRequest::AddPattern. Lorsqu’un modèle de contrôle est mis en cache, ses propriétés ne sont pas automatiquement mises en cache ; vous devez spécifier les propriétés que vous souhaitez mettre en cache à l’aide de AddProperty.

Vous pouvez récupérer une propriété de modèle de contrôle (par exemple, la propriété Value du modèle de contrôle Value ), sans avoir à récupérer l’intégralité du modèle de contrôle dans le cache. Vous devez récupérer le modèle de contrôle uniquement si vous devez utiliser une méthode de modèle de contrôle.

Spécification de l’étendue et du filtrage d’une demande de mise en cache

Vous pouvez spécifier les éléments dont vous souhaitez mettre en cache les propriétés et les modèles de contrôle en définissant la propriété IUIAutomationCacheRequest::TreeScope avant d’utiliser la requête. L’étendue est relative aux éléments récupérés par la méthode à laquelle la demande de cache est passée. Par exemple, si vous définissez uniquement TreeScope_Children, puis récupérez un élément UI Automation, les propriétés et les modèles de contrôle des enfants de cet élément sont mis en cache, mais les propriétés et les modèles de contrôle de l’élément lui-même ne sont pas mis en cache. Pour vous assurer que la mise en cache est effectuée pour l’élément récupéré lui-même, vous devez inclure TreeScope_Element dans la propriété IUIAutomationCacheRequest::TreeScope . Il n’est pas possible de définir l’étendue sur TreeScope_Parent ou TreeScope_Ancestors. Toutefois, un élément parent peut être mis en cache lorsqu’un élément enfant est mis en cache. Dans cette rubrique, consultez la section Récupération des enfants et des parents mis en cache.

L’étendue de la mise en cache est également affectée par la propriété IUIAutomationCacheRequest::TreeFilter . Par défaut, la mise en cache est effectuée uniquement pour les éléments qui apparaissent dans la vue de contrôle de l’arborescence UI Automation. Vous pouvez toutefois modifier cette propriété pour appliquer la mise en cache à tous les éléments ou uniquement aux éléments qui apparaissent dans la vue de contenu.

Force des références d’élément

Lorsque vous récupérez un élément Automation, par défaut, vous avez accès à toutes les propriétés et modèles de contrôle de cet élément, y compris les propriétés et les modèles de contrôle qui n’ont pas été mis en cache. Toutefois, vous pouvez spécifier que la référence à l’élément fait référence uniquement aux données mises en cache, en définissant la propriété IUIAutomationCacheRequest::AutomationElementMode sur AutomationElementMode_None. Dans ce cas, vous n’avez pas accès aux propriétés non mises en cache et aux modèles de contrôle des éléments récupérés. Cela signifie que vous ne pouvez pas accéder à des propriétés actuelles telles que IUIAutomationElement::CurrentIsEnabled ou récupérer un modèle de contrôle à l’aide de IUIAutomationElement::GetCurrentPattern. Sur les modèles de contrôle mis en cache, vous ne pouvez pas appeler des méthodes qui effectuent des actions sur le contrôle, telles que IUIAutomationInvokePattern::Invoke.

Un lecteur d’écran est un exemple d’application qui n’a pas besoin de références complètes à des objets, qui peut prérécupérer les propriétés de nom et de type de contrôle des éléments d’une fenêtre sans avoir besoin des objets d’élément Automation eux-mêmes.

Récupération des enfants et des parents mis en cache

Lorsque vous récupérez un élément Automation et la mise en cache des demandes pour les enfants de cet élément via la propriété IUIAutomationCacheRequest::TreeScope de la requête, il est possible d’obtenir les éléments enfants en appelant IUIAutomationElement::GetCachedChildren sur l’élément que vous avez récupéré.

Si TreeScope_Element a été inclus dans l’étendue de la demande de cache, l’élément racine de la demande peut être récupéré en appelant IUIAutomationElement::GetCachedParent sur l’un des éléments enfants.

Notes

Vous ne pouvez pas mettre en cache les parents ou les ancêtres de l’élément racine de la requête.

 

Récupération d’un nouvel instantané du cache

Le cache reste valide tant que rien ne change dans l’IU. Votre application est généralement chargée de récupérer une nouvelle instantané du cache en réponse à des événements.

Si vous vous abonnez à un événement avec une demande de cache, vous obtenez un nouvel instantané IUIAutomationElement du cache en tant que source de l’événement chaque fois que votre gestionnaire d’événements est appelé. Vous pouvez également récupérer une nouvelle instantané d’informations mises en cache pour un élément en appelant IUIAutomationElement::BuildUpdatedCache. Vous pouvez passer la demande IUIAutomationCacheRequest d’origine pour obtenir une nouvelle instantané de toutes les informations précédemment mises en cache.

La récupération d’une nouvelle instantané du cache ne modifie pas les propriétés des références IUIAutomationElement existantes.

Exemples

Pour obtenir des exemples de code qui montrent comment utiliser les fonctionnalités de mise en cache de UI Automation, consultez Guide pratique pour utiliser la mise en cache.

Conceptuel

Vue d'ensemble des modèles de contrôle UI Automation

Obtention d'éléments UI Automation

Vue d'ensemble des propriétés UI Automation