Mise en cache dans les clients UI Automation

Notes

Cette documentation s’adresse aux développeurs .NET Framework qui souhaitent utiliser les classes UI Automation managées définies dans l’espace de noms System.Windows.Automation. Pour obtenir les dernières informations sur UI Automation, consultez API Windows Automation : UI Automation.

Cette rubrique présente la mise en cache des modèles de contrôle et des propriétés UI Automation.

Dans UI Automation, la mise en cache correspond à la prérécupération des données. Les données sont ensuite accessibles sans communication interprocessus supplémentaire. La mise en cache est généralement utilisée par les applications clientes UI Automation pour récupérer des propriétés et des modèles de contrôle en bloc. Les informations sont ensuite récupérées à partir du cache selon les besoins. L’application met à jour le cache périodiquement, habituellement en réponse aux événements signifiant que quelque chose a changé dans l’interface utilisateur (IU).

Les avantages de la mise en cache sont plus perceptibles avec les contrôles Windows Presentation Foundation (WPF) et les contrôles personnalisés qui possèdent des fournisseurs UI Automation côté serveur. L’accès aux fournisseurs côté client, tels que les fournisseurs par défaut pour les contrôles Win32, présente moins d’avantages.

La mise en cache se produit lorsque l’application active un CacheRequest puis utilise une méthode ou une propriété qui retourne un AutomationElement. Par exemple, FindFirst, FindAll. Les méthodes de la classe TreeWalker font exception à cette règle. La mise en cache s’effectue uniquement si un CacheRequest est spécifié comme paramètre (par exemple, TreeWalker.GetFirstChild(AutomationElement, CacheRequest).

La mise en cache se produit également lorsque vous vous abonnez à un événement alors qu’un CacheRequest est actif. L’objet AutomationElement passé au gestionnaire d’événements comme source d’un événement contient les propriétés mises en cache et les modèles spécifiés par le CacheRequestd’origine. Toute modification apportée au CacheRequest après votre abonnement à l’événement n’a aucun effet.

Il est possible de mettre en cache les propriétés et les modèles de contrôle UI Automation d’un élément.

Options de mise en cache

CacheRequest spécifie les options suivantes de mise en cache.

Propriétés à mettre en cache

Vous pouvez spécifier des propriétés à mettre en cache en appelant Add(AutomationProperty) pour chaque propriété avant d’activer la requête.

Modèles de contrôle à mettre en cache

Vous pouvez spécifier des modèles de contrôle à mettre en cache en appelant Add(AutomationPattern) pour chaque modèle avant d’activer la requête. Lorsqu’un modè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 voulez mettre en cache en utilisant CacheRequest.Add.

Portée et filtrage de la mise en cache

Vous pouvez spécifier les éléments dont vous voulez mettre en cache les propriétés et les modèles en définissant la propriété CacheRequest.TreeScope avant d’activer la requête. La portée est relative aux éléments qui sont récupérés lorsque la requête est active. Par exemple, si vous définissez uniquement Childrenet que vous récupérez ensuite un AutomationElement, les propriétés et les modèles des enfants de cet élément sont mis en cache, mais pas ceux de l’élément lui-même. Pour vous assurer que la mise en cache s’effectue pour l’élément récupéré lui-même, vous devez inclure Element dans la propriété TreeScope . Il n’est pas possible de définir la portée sur Parent ni Ancestors. Un élément parent peut toutefois être mis en cache pendant la mise en cache d’un élément enfant. Pour plus d’informations, consultez Récupération des éléments enfants et parents mis en cache.

L’étendue de la mise en cache est également affectée par la propriété CacheRequest.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’un élément

Lorsque vous récupérez un AutomationElement, vous avez accès par défaut à toutes les propriétés et à tous les modèles de cet élément, y compris à ceux qui n’ont pas été mis en cache. Toutefois, pour une meilleure efficacité, vous pouvez spécifier que la référence à l’élément renvoie uniquement aux données mises en cache, en affectant à la propriété AutomationElementMode du CacheRequest la valeur None. Dans ce cas, vous n’avez pas accès aux propriétés et aux modèles non mis en cache des éléments récupérés. Cela signifie que vous n’avez pas accès aux propriétés via GetCurrentPropertyValue ou la propriété Current d’ AutomationElement ou un modèle de contrôle quelconque. Vous ne pouvez pas non plus récupérer un modèle en utilisant GetCurrentPattern ou TryGetCurrentPattern. Dans les modèles mis en cache, vous pouvez appeler des méthodes qui récupèrent les propriétés de tableau, telles que SelectionPattern.SelectionPatternInformation.GetSelection, mais aucune qui exécute des actions sur le contrôle, comme InvokePattern.Invoke.

Un lecteur d’écran est un exemple d’application qui n’a pas forcément besoin de références complètes aux objets. Il prérécupère les propriétés Name et ControlType des éléments dans une fenêtre mais n’a pas besoin des objets AutomationElement eux-mêmes.

Activation de CacheRequest

La mise en cache s’effectue uniquement quand les objets AutomationElement sont récupérés alors qu’un CacheRequest est actif pour le thread en cours. Il existe deux façons d’activer un CacheRequest.

La plus courante consiste à appeler Activate. Cette méthode retourne un objet qui implémente IDisposable. La requête reste active tant que l’objet IDisposable existe. La manière la plus simple de contrôler la durée de vie de l’objet consiste à placer l’appel dans un bloc using (C#) ou Using (Visual Basic). Cela garantit l’extraction de la demande de la pile même si une exception est levée.

L’autre manière, utile quand vous souhaitez imbriquer des requêtes de cache, consiste à appeler Push. Cette opération place la requête sur une pile et l’active. La requête reste active jusqu’à ce qu’elle soit supprimée de la pile par Pop. La requête devient temporairement inactive si une autre requête est envoyée à la pile. Seule la première requête sur la pile est active.

Récupération des propriétés mises en cache

Vous pouvez récupérer les propriétés mises en cache d’un élément via les méthodes et les propriétés suivantes.

Une exception est levée si la propriété demandée ne figure pas dans le cache.

Cached, comme Current, expose des propriétés individuelles en tant que membres d’une structure. Toutefois, vous n’avez pas besoin de récupérer cette structure. Vous pouvez accéder directement aux propriétés individuelles. Par exemple, la propriété Name peut être obtenue à partir de element.Cached.Name, où element est un AutomationElement.

Récupération des modèles de contrôle mis en cache

Vous pouvez récupérer les modèles de contrôle mis en cache d’un élément via les méthodes suivantes.

Si le modèle n’est pas dans le cache, GetCachedPattern lève une exception et TryGetCachedPattern retourne false.

Vous pouvez récupérer les propriétés mises en cache d’un modèle de contrôle à l’aide de la propriété Cached de l’objet de modèle. Vous pouvez également récupérer les valeurs en cours via la propriété Current , mais uniquement si None n’a pas été spécifié quand AutomationElement a été récupéré. (Full est la valeur par défaut qui donne accès aux valeurs actuelles.)

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

Quand vous récupérez un AutomationElement et que vous demandez la mise en cache pour les enfants de cet élément via la propriété TreeScope de la requête, il est possible, par la suite, d’obtenir les éléments enfants de la propriété CachedChildren de l’élément que vous avez récupéré.

Si Element a été inclus dans la portée de la requête de cache, l’élément racine de la requête est ensuite disponible à partir de la propriété CachedParent de chacun 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.

Mise à jour du cache

Le cache reste valide tant que rien ne change dans l’IU. Votre application est responsable de la mise à jour du cache, généralement en réponse à des événements.

Si vous vous abonnez à un événement quand un CacheRequest est actif, vous obtenez un AutomationElement avec un cache mis à jour comme source de l’événement chaque fois que votre délégué de gestionnaire d’événements est appelé. Vous pouvez également mettre à jour les informations mises en cache d’un élément en appelant GetUpdatedCache. Vous pouvez passer le CacheRequest d’origine pour mettre à jour toutes les informations précédemment mises en cache.

La mise à jour du cache n’altère pas les propriétés des références AutomationElement existantes.

Voir aussi