Mise en cache dans les clients UI Automation

RemarqueRemarque

Cette documentation s'adresse aux développeurs .NET Framework qui veulent utiliser les classes UI Automation managées définies dans l'espace de noms System.Windows.Automation.Pour obtenir les informations les plus récentes sur UI Automation, consultez API Windows Automation : UI Automation (page éventuellement en anglais).

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 de client 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 si nécessaire. L'application met à jour le cache périodiquement, habituellement en réponse aux événements signifiant que quelque chose a été modifié dans l'user interface (UI).

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 ont 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 a lieu lorsque l'application active un CacheRequest et utilise ensuite 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 est effectuée uniquement si un CacheRequest est spécifié comme paramètre (par exemple, TreeWalker.GetFirstChild(AutomationElement, CacheRequest)).

La mise en cache a également lieu lorsque vous vous abonnez à un événement alors qu'un CacheRequest est actif. L'AutomationElement passé à votre 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 CacheRequest d'origine. Toute modification apportée au CacheRequest après votre abonnement à l'événement n'a aucun effet.

Les propriétés et les modèles de contrôle UI Automation d'un élément peuvent être mis en cache.

Cette rubrique comprend les sections suivantes.

  • Options pour la mise en cache
  • Activation de CacheRequest
  • Récupération des propriétés mises en cache
  • Récupération des modèles de contrôle mis en cache
  • Récupération des enfants et des parents mis en cache
  • Mise à jour du cache
  • Rubriques connexes

Options pour la mise en cache

Le CacheRequest spécifie les options suivantes pour la 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 souhaitez 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 souhaitez 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 ne définissez que Children et 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 est effectuée pour l'élément récupéré lui-même, vous devez inclure Element dans la propriété TreeScope. Vous ne pouvez pas définir la portée sur Parent ou Ancestors. Toutefois, un élément parent peut être mis en cache lorsqu'un élément enfant est mis en cache ; consultez la section « Récupération des enfants et des parents mis en cache » de cette rubrique.

L'étendue de la mise en cache est également affectée par la propriété CacheRequest.TreeFilter. Par défaut, la mise en cache n'est exécutée que pour les éléments qui apparaissent dans l'affichage de contrôle de l'arborescence UI Automation. Vous pouvez toutefois modifier cette propriété de sorte que la mise en cache soit appliquée à tous les éléments ou uniquement aux éléments qui apparaissent dans l'affichage du 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 None à la propriété AutomationElementMode du CacheRequest. 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 ; 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, comme SelectionPattern.SelectionPatternInformation.GetSelection, mais aucune qui exécute des actions sur le contrôle, telle que InvokePattern.Invoke.

Le 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 ne s'exécute que lorsque les objets AutomationElement sont récupérés alors qu'un CacheRequest est actif pour le thread en cours. Il existe deux manières 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 permet à la requête d'être dépilée, même si une exception est levée.

L'autre manière, utile lorsque vous souhaitez imbriquer des requêtes de cache, consiste à appeler Push. La requête est ainsi mise sur une pile et activée. 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 déposée sur la pile ; seule la première requête de 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 propriétés suivantes.

Une exception est levée si la propriété demandée n'est 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é lorsque l'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

Lorsque 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 par la suite disponible à partir de la propriété CachedParent de chacun des éléments enfants.

RemarqueRemarque

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 qu'aucune modification n'est apportée à l'UI. 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 lorsqu'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 dans le CacheRequest d'origine pour mettre à jour toutes les informations mises en cache auparavant.

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

Voir aussi

Tâches

Utiliser la mise en cache dans UI Automation

FetchTimer Sample

Concepts

Événements UI Automation pour les clients