Partager via


UI Automation et Microsoft Active Accessibility

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).

Microsoft Active Accessibility était la solution précédemment utilisée pour rendre les applications accessibles. Microsoft UI Automation est le nouveau modèle d'accessibilité pour Microsoft Windows et est conçu pour répondre aux besoins des produits de technologie d'assistance et des outils de test automatisés. UI Automation offre de nombreuses améliorations par rapport à Active Accessibility.

Cette rubrique inclut les principales fonctionnalités de UI Automation et explique en quoi ces fonctionnalités diffèrent de Active Accessibility.

Cette rubrique comprend les sections suivantes.

  • Langages de programmation
  • Prise en charge dans Windows Presentation Foundation
  • Serveurs et clients
  • Éléments d'interface
  • Arborescences et navigation
  • Rôles et types de contrôle
  • États et propriétés
  • Événements
  • Sécurité
  • Rubriques connexes

Langages de programmation

Active Accessibility est basé sur le Component Object Model (COM) avec une prise en charge pour les interfaces doubles. Par conséquent, il est programmable en C/C++, en Microsoft Visual Basic 6.0 et en langages de script. UI Automation (y compris la bibliothèque du fournisseur côté client pour les contrôles standard) est écrit en code managé et les applications du client UI Automation sont programmées plus facilement à l'aide de Microsoft Visual C# ou de Microsoft Visual Basic .NET. Les fournisseurs UI Automation, qui sont des implémentations d'interface, peuvent être écrits en code managé ou en C/C++.

Prise en charge dans Windows Presentation Foundation

Windows Presentation Foundation (WPF) est le nouveau modèle pour la création d'interfaces utilisateur. Les éléments WPF n'assurent pas la prise en charge native d'Active Accessibility ; en revanche, ils prennent en charge UI Automation, qui inclut une prise en charge de liaison pour les clients Active Accessibility. Seuls les clients spécifiquement écrits pour UI Automation peuvent entièrement tirer parti des fonctionnalités d'accessibilité de WPF, comme la prise en charge étendue pour le texte.

Serveurs et clients

Dans Active Accessibility, les serveurs et les clients communiquent directement, en grande partie via l'implémentation de IAccessible par le serveur.

Dans UI Automation, un service principal se trouve entre le serveur (appelé fournisseur) et le client. Le service principal appelle les interfaces implémentées par des fournisseurs et fournit des services supplémentaires tels que la génération d'identificateurs d'exécution uniques pour les éléments. Les applications clientes utilisent des fonctions de bibliothèque pour appeler le service UI Automation.

Les fournisseurs UI Automation peuvent fournir des informations aux clients Active Accessibility et les serveurs Active Accessibility peuvent fournir des informations aux applications du client UI Automation. Toutefois, étant donné que Active Accessibility n'expose pas autant d'informations que UI Automation, les deux modèles ne sont pas complètement compatibles.

Éléments d'interface

Active Accessibility présente les éléments d'UI soit comme une interface IAccessible, soit comme un identificateur enfant. Il est difficile de comparer deux pointeurs IAccessible pour déterminer s'ils font référence au même élément.

Dans UI Automation, chaque élément est représenté comme un objet AutomationElement. La comparaison se fait à l'aide de l'opérateur d'égalité ou de la méthode Equals, qui comparent tous les deux les identificateurs d'exécution uniques des éléments.

Arborescences et navigation

À l'écran, les éléments d'user interface (UI) peuvent être affichés sous forme d'arborescence : le bureau est la racine, les fenêtres d'application sont les enfants immédiats et les éléments des applications sont d'autres descendants.

Dans Active Accessibility, de nombreux éléments Automation, sans importance pour l'utilisateur final, sont exposés dans l'arborescence. Les applications clientes doivent étudier tous les éléments pour déterminer ceux qui sont explicites.

Les applications du client UI Automation voient l'UI via un affichage filtré. L'affichage ne contient que des éléments intéressants : ceux qui donnent des informations à l'utilisateur ou qui permettent l'interaction. Des vues prédéfinies affichant uniquement les éléments de contrôle et uniquement les éléments de contenu sont disponibles. En outre, les applications peuvent définir des vues personnalisées. UI Automation simplifie la tâche de description de l'UI à destination de l'utilisateur et aide ce dernier à interagir avec l'application.

Dans Active Accessibility, la navigation entre les éléments peut être spatiale (par exemple, déplacement vers l'élément qui se trouve à gauche de l'écran), logique (par exemple, déplacement vers l'élément de menu suivant ou vers l'élément suivant dans l'ordre de tabulation d'une boîte de dialogue) ou hiérarchique (par exemple, déplacement du premier enfant d'un conteneur ou d'un enfant vers son parent). La navigation hiérarchique est compliquée du fait que les éléments enfants ne sont pas toujours des objets qui implémentent IAccessible.

Dans UI Automation, tous les éléments d'UI sont des objets AutomationElement qui prennent en charge les mêmes fonctionnalités de base. (Du point de vue du fournisseur, ce sont des objets qui implémentent une interface héritée de IRawElementProviderSimple.) La navigation est principalement hiérarchique : des parents aux enfants et d'un frère à un autre. (La navigation entre frères a un élément logique car elle peut suivre l'ordre de tabulation.) Vous pouvez naviguer à partir de n'importe quel point de départ à l'aide d'un affichage filtré de l'arborescence, en utilisant la classe TreeWalker. Vous pouvez également naviguer vers des enfants ou des descendants particuliers à l'aide de FindFirst et FindAll ; par exemple, il est très simple de récupérer tous les éléments d'une boîte de dialogue qui prennent en charge un modèle de contrôle spécifié.

Dans UI Automation, la navigation est plus cohérente que dans Active Accessibility. Certains éléments tels que les listes déroulantes et les fenêtres indépendantes apparaissent deux fois dans l'arborescence Active Accessibility et le fait de naviguer depuis ces éléments peut entraîner des résultats inattendus. Il est en fait impossible d'implémenter correctement Active Accessibility pour un contrôle rebar. UI Automation permet le reparentage et le repositionnement, afin qu'un élément puisse être placé n'importe où dans l'arborescence en dépit de la hiérarchie imposée par la propriété des fenêtres.

Rôles et types de contrôle

Active Accessibility utilise la propriété accRole (IAccessible::get_actRole) pour récupérer une description du rôle de l'élément dans l'UI, comme ROLE_SYSTEM_SLIDER ou ROLE_SYSTEM_MENUITEM. Le rôle d'un élément est l'indice principal pour connaître ses fonctionnalités disponibles. L'interaction avec un contrôle est accomplie à l'aide de méthodes fixes telles que IAccessible::accSelect et IAccessible::accDoDefaultAction. L'interaction entre l'application cliente et l'UI est limitée à ce qui peut être effectué via IAccessible.

En revanche, UI Automation découple en grande partie le type de contrôle de l'élément (décrit par la propriété ControlType) de ses fonctionnalités attendues. Les fonctionnalités sont déterminées par les modèles de contrôle pris en charge par le fournisseur via son implémentation d'interfaces spécialisées. Les modèles de contrôle peuvent être associés pour décrire le jeu complet des fonctionnalités prises en charge par un élément d'UI particulier. Certains fournisseurs doivent prendre en charge un modèle de contrôle particulier ; par exemple, le fournisseur d'une case à cocher doit prendre en charge le modèle de contrôle Toggle. D'autres fournisseurs doivent prendre en charge un ou plusieurs éléments d'un jeu de modèles de contrôle ; par exemple, un bouton doit prendre en charge Toggle ou Invoke. D'autres encore ne prennent en charge aucun modèle de contrôle ; par exemple, un volet qui ne peut pas être déplacé, redimensionné ou ancré n'a pas de modèles de contrôle.

UI Automation prend en charge des contrôles personnalisés, identifiés par la propriété Custom et pouvant être décrits par la propriété LocalizedControlTypeProperty.

Le tableau suivant montre le mappage de rôles Active Accessibility à des types de contrôle UI Automation.

Rôle Active Accessibility

Type de contrôle UI Automation

ROLE_SYSTEM_PUSHBUTTON

Button

ROLE_SYSTEM_CLIENT

Calendar

ROLE_SYSTEM_CHECKBUTTON

Check Box

ROLE_SYSTEM_COMBOBOX

Combo Box

ROLE_SYSTEM_CLIENT

Personnalisé

ROLE_SYSTEM_LIST

Data Grid

ROLE_SYSTEM_LISTITEM

Data Item

ROLE_SYSTEM_DOCUMENT

Document

ROLE_SYSTEM_TEXT

Modifier

ROLE_SYSTEM_GROUPING

Groupe

ROLE_SYSTEM_LIST

Header

ROLE_SYSTEM_COLUMNHEADER

Header Item

ROLE_SYSTEM_LINK

Hyperlink

ROLE_SYSTEM_GRAPHIC

Image

ROLE_SYSTEM_LIST

List

ROLE_SYSTEM_LISTITEM

List Item

ROLE_SYSTEM_MENUPOPUP

Menu

ROLE_SYSTEM_MENUBAR

Menu Bar

ROLE_SYSTEM_MENUITEM

Menu Item

ROLE_SYSTEM_PANE

Pane

ROLE_SYSTEM_PROGRESSBAR

Progress Bar

ROLE_SYSTEM_RADIOBUTTON

Radio Button

ROLE_SYSTEM_SCROLLBAR

Scroll Bar

ROLE_SYSTEM_SEPARATOR

Separator

ROLE_SYSTEM_SLIDER

Slider

ROLE_SYSTEM_SPINBUTTON

Spinner

ROLE_SYSTEM_SPLITBUTTON

Split Button

ROLE_SYSTEM_STATUSBAR

Status Bar

ROLE_SYSTEM_PAGETABLIST

Onglet

ROLE_SYSTEM_PAGETAB

Tab Item

ROLE_SYSTEM_TABLE

Table

ROLE_SYSTEM_STATICTEXT

Texte

ROLE_SYSTEM_INDICATOR

Thumb

ROLE_SYSTEM_TITLEBAR

Title Bar

ROLE_SYSTEM_TOOLBAR

Tool Bar

ROLE_SYSTEM_TOOLTIP

ToolTip

ROLE_SYSTEM_OUTLINE

Tree

ROLE_SYSTEM_OUTLINEITEM

Tree Item

ROLE_SYSTEM_WINDOW

Window

Pour plus d'informations sur les différents types de contrôle, consultez Types de contrôle UI Automation.

États et propriétés

Dans Active Accessibility, les éléments prennent en charge un jeu commun de propriétés et certaines propriétés (telles que accState) doivent décrire des aspects très différents, selon le rôle de l'élément. Les serveurs doivent implémenter toutes les méthodes de IAccessible qui retournent une propriété, même celles qui ne concernent pas l'élément.

UI Automation définit beaucoup plus de propriétés ; certaines d'entre elles correspondent aux états dans Active Accessibility. Certaines sont communes à tous les éléments, tandis que d'autres sont spécifiques aux types de contrôle et aux motifs de contrôle. Les propriétés se distinguent par des identificateurs uniques et la majorité des propriétés peuvent être récupérées à l'aide d'une seule méthode, GetCurrentPropertyValue ou GetCachedPropertyValue. De nombreuses propriétés sont également facilement récupérables à partir des accesseurs de propriété Current et Cached.

Un fournisseur UI Automation n'est pas obligé d'implémenter des propriétés non pertinentes, mais peut simplement retourner une valeur null pour toutes les propriétés qu'il ne prend pas en charge. Le service principal UI Automation peut également obtenir des propriétés depuis le fournisseur de fenêtres par défaut. Ces dernières sont fusionnées avec les propriétés implémentées explicitement par le fournisseur.

En plus de prendre en charge beaucoup plus de propriétés, UI Automation fournit de meilleures performances en autorisant la récupération de plusieurs propriétés avec un seul appel interprocessus.

Le tableau suivant montre la correspondance entre les propriétés dans les deux modèles.

Accesseur de propriété Active Accessibility

ID de propriété UI Automation

Notes

get_accKeyboardShortcut

AccessKeyProperty ou AcceleratorKeyProperty

Si les deux sont présents, AccessKeyProperty a la priorité.

get_accName

NameProperty

get_accRole

ControlTypeProperty

Pour le mappage de rôles à des types de contrôle, consultez le tableau précédent.

get_accValue

ValuePattern.ValueProperty

RangeValuePattern.ValueProperty

Uniquement valide pour les types de contrôle qui prennent en charge ValuePattern ou RangeValuePattern. Les valeurs RangeValue sont normalisées de 0 à 100, pour être cohérentes avec le comportement MSAA. Les éléments de valeur utilisent une chaîne.

get_accHelp

HelpTextProperty

accLocation

BoundingRectangleProperty

get_accDescription

Non pris en charge dans UI Automation

accDescription n'avait pas de spécification claire dans MSAA ; les fournisseurs ont donc placé différentes informations dans cette propriété.

get_accHelpTopic

Non pris en charge dans UI Automation

Le tableau suivant montre quelles propriétés UI Automation correspondent aux constantes d'état Active Accessibility.

État Active Accessibility

Propriété UI Automation

Déclenche une modification de l'état ?

STATE_SYSTEM_CHECKED

Pour la case à cocher, ToggleStateProperty

Pour la case d'option, IsSelectedProperty

Y

STATE_SYSTEM_COLLAPSED

ExpandCollapseState = Collapsed

Y

STATE_SYSTEM_EXPANDED

ExpandCollapseState = Expanded ou PartiallyExpanded

Y

STATE_SYSTEM_FOCUSABLE

IsKeyboardFocusableProperty

N

STATE_SYSTEM_FOCUSED

HasKeyboardFocusProperty

N

STATE_SYSTEM_HASPOPUP

ExpandCollapsePattern pour les éléments de menu

N

STATE_SYSTEM_INVISIBLE

IsOffscreenProperty = True et GetClickablePoint provoque NoClickablePointException

N

STATE_SYSTEM_LINKED

ControlTypeProperty =

Hyperlink

N

STATE_SYSTEM_MIXED

ToggleState = Indeterminate

N

STATE_SYSTEM_MOVEABLE

CanMoveProperty

N

STATE_SYSTEM_MUTLISELECTABLE

CanSelectMultipleProperty

N

STATE_SYSTEM_OFFSCREEN

IsOffscreenProperty = True

N

STATE_SYSTEM_PROTECTED

IsPasswordProperty

N

STATE_SYSTEM_READONLY

RangeValuePattern.IsReadOnlyProperty et ValuePattern.IsReadOnlyProperty

N

STATE_SYSTEM_SELECTABLE

SelectionItemPattern est pris en charge

N

STATE_SYSTEM_SELECTED

IsSelectedProperty

N

STATE_SYSTEM_SIZEABLE

CanResize

N

STATE_SYSTEM_UNAVAILABLE

IsEnabledProperty

Y

Les états suivants n'ont pas été implémentés par la plupart des serveurs de contrôle Active Accessibility ou n'ont aucun équivalent dans UI Automation.

État Active Accessibility

Notes

STATE_SYSTEM_BUSY

Non disponible dans UI Automation

STATE_SYSTEM_DEFAULT

Non disponible dans UI Automation

STATE_SYSTEM_ANIMATED

Non disponible dans UI Automation

STATE_SYSTEM_EXTSELECTABLE

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_MARQUEED

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_SELFVOICING

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_TRAVERSED

Non disponible dans UI Automation

STATE_SYSTEM_ALERT_HIGH

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_ALERT_MEDIUM

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_ALERT_LOW

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_FLOATING

Non largement implémenté par les serveurs Active Accessibility

STATE_SYSTEM_HOTTRACKED

Non disponible dans UI Automation

STATE_SYSTEM_PRESSED

Non disponible dans UI Automation

Pour obtenir une liste complète des identificateurs de propriété UI Automation, consultez Vue d'ensemble des propriétés UI Automation.

Événements

Dans UI Automation, contrairement à Active Accessibility, le mécanisme d'événement ne repose pas sur le routage des événements Windows (étroitement lié aux handles de fenêtres) et ne requiert pas l'application cliente pour pouvoir installer des raccordements. Les abonnements aux événements peuvent être ajustés non seulement à des événements particuliers mais également à des parties spécifiques de l'arborescence. Les fournisseurs peuvent également ajuster leur déclenchement d'événements en assurant le suivi des événements qui sont écoutés.

Il est également plus facile pour les clients de récupérer les éléments qui déclenchent des événements, car ils sont passés directement au rappel d'événement. Les propriétés de l'élément sont automatiquement prérécupérées si une requête de cache était active lorsque le client s'est abonné à l'événement.

Le tableau suivant montre la correspondance entre les WinEvents Active Accessibility et les événements UI Automation.

WinEvent

Identificateur d'événement UI Automation

EVENT_OBJECT_ACCELERATORCHANGE

Modification de la propriété AcceleratorKeyProperty

EVENT_OBJECT_CONTENTSCROLLED

Modification de la propriété VerticalScrollPercentProperty ou HorizontalScrollPercentProperty sur les barres de défilement associées

EVENT_OBJECT_CREATE

StructureChangedEvent

EVENT_OBJECT_DEFACTIONCHANGE

Pas d'équivalent

EVENT_OBJECT_DESCRIPTIONCHANGE

Pas d'équivalent exact ; éventuelle modification de la propriété HelpTextProperty ou LocalizedControlTypeProperty

EVENT_OBJECT_DESTROY

StructureChangedEvent

EVENT_OBJECT_FOCUS

AutomationFocusChangedEvent

EVENT_OBJECT_HELPCHANGE

Modification de HelpTextProperty

EVENT_OBJECT_HIDE

StructureChangedEvent

EVENT_OBJECT_LOCATIONCHANGE

Modification de la propriété BoundingRectangleProperty

EVENT_OBJECT_NAMECHANGE

Modification de la propriété NameProperty

EVENT_OBJECT_PARENTCHANGE

StructureChangedEvent

EVENT_OBJECT_REORDER

Pas utilisé de manière cohérente dans Active Accessibility. Aucun événement correspondant directement n'est défini dans UI Automation.

EVENT_OBJECT_SELECTION

ElementSelectedEvent

EVENT_OBJECT_SELECTIONADD

ElementAddedToSelectionEvent

EVENT_OBJECT_SELECTIONREMOVE

ElementRemovedFromSelectionEvent

EVENT_OBJECT_SELECTIONWITHIN

Pas d'équivalent

EVENT_OBJECT_SHOW

StructureChangedEvent

EVENT_OBJECT_STATECHANGE

Différents événements de modification de propriété

EVENT_OBJECT_VALUECHANGE

RangeValuePattern.ValueProperty et ValuePattern.ValueProperty modifiés

EVENT_SYSTEM_ALERT

Pas d'équivalent

EVENT_SYSTEM_CAPTUREEND

Pas d'équivalent

EVENT_SYSTEM_CAPTURESTART

Pas d'équivalent

EVENT_SYSTEM_CONTEXTHELPEND

Pas d'équivalent

EVENT_SYSTEM_CONTEXTHELPSTART

Pas d'équivalent

EVENT_SYSTEM_DIALOGEND

WindowClosedEvent

EVENT_SYSTEM_DIALOGSTART

WindowOpenedEvent

EVENT_SYSTEM_DRAGDROPEND

Pas d'équivalent

EVENT_SYSTEM_DRAGDROPSTART

Pas d'équivalent

EVENT_SYSTEM_FOREGROUND

AutomationFocusChangedEvent

EVENT_SYSTEM_MENUEND

MenuClosedEvent

EVENT_SYSTEM_MENUPOPUPEND

MenuClosedEvent

EVENT_SYSTEM_MENUPOPUPSTART

MenuOpenedEvent

EVENT_SYSTEM_MENUSTART

MenuOpenedEvent

EVENT_SYSTEM_MINIMIZEEND

Modification de la propriété WindowVisualStateProperty

EVENT_SYSTEM_MINIMIZESTART

Modification de la propriété WindowVisualStateProperty

EVENT_SYSTEM_MOVESIZEEND

Modification de la propriété BoundingRectangleProperty

EVENT_SYSTEM_MOVESIZESTART

Modification de la propriété BoundingRectangleProperty

EVENT_SYSTEM_SCROLLINGEND

Modification de la propriété VerticalScrollPercentProperty ou HorizontalScrollPercentProperty

EVENT_SYSTEM_SCROLLINGSTART

Modification de la propriété VerticalScrollPercentProperty ou HorizontalScrollPercentProperty

EVENT_SYSTEM_SOUND

Pas d'équivalent

EVENT_SYSTEM_SWITCHEND

Aucun équivalent, mais un événement AutomationFocusChangedEvent signale qu'une nouvelle application a reçu le focus

EVENT_SYSTEM_SWITCHSTART

Pas d'équivalent

Pas d'équivalent

Modification de la propriété CurrentViewProperty

Pas d'équivalent

Modification de la propriété HorizontallyScrollableProperty

Pas d'équivalent

Modification de la propriété VerticallyScrollableProperty

Pas d'équivalent

Modification de la propriété HorizontalScrollPercentProperty

Pas d'équivalent

Modification de la propriété VerticalScrollPercentProperty

Pas d'équivalent

Modification de la propriété HorizontalViewSizeProperty

Pas d'équivalent

Modification de la propriété VerticalViewSizeProperty

Pas d'équivalent

Modification de la propriété ToggleStateProperty

Pas d'équivalent

Modification de la propriété WindowVisualStateProperty

Pas d'équivalent

Événement AsyncContentLoadedEvent

Pas d'équivalent

ToolTipOpenedEvent

Sécurité

Certains scénarios de personnalisation IAccessible requièrent l'encapsulation d'un IAccessible de base et l'appel via celui-ci. Cela a des conséquences en matière de sécurité car un composant avec un niveau de confiance partiel ne doit pas être un intermédiaire sur un chemin de code.

Le modèle UI Automation supprime le besoin qu'ont les fournisseurs d'appeler via un autre code de fournisseur. Le service principal UI Automation effectue toute l'agrégation nécessaire.

Voir aussi

Autres ressources

Notions de base d'UI Automation