Comment UI Automation expose les objets incorporés

Cette rubrique décrit comment Microsoft UI Automation utilise les modèles de contrôle Text et TextRange pour exposer des objets incorporés (éléments enfants/descendants) dans un document texte ou un conteneur.

Par UI Automation, un objet incorporé est un élément qui a des limites non textuelles telles qu’une image, un lien hypertexte, une table ou un type de document (feuille de calcul Microsoft Excel, fichier Microsoft Windows Media, etc.).

Notes

Cela diffère de la définition OLE COM (Component Object Model) (voir Objets incorporés), où un élément est créé dans une application et incorporé ou lié dans une autre application. La possibilité de modifier l’objet dans son application d’origine n’est pas pertinente dans le contexte de UI Automation.

Objets incorporés et arborescence UI Automation

Les objets incorporés sont traités comme des éléments individuels dans la vue de contrôle de l’arborescence UI Automation. Ils sont exposés en tant qu’enfants du conteneur de texte afin d’être accessibles via le même modèle objet que d’autres contrôles dans UI Automation.

Le tableau suivant répertorie des exemples d’éléments conteneur et non-conteneur.

Éléments conteneurs

Éléments non-conteneur

  • Calendrier
  • Combobox
  • DataGrid
  • Document
  • Modifier
  • Groupe
  • En-tête
  • HeaderItem
  • Liste
  • Menu
  • MenuBar
  • Volet
  • SplitButton
  • Onglet
  • Table de charge de travail
  • Barre d'outils
  • Arborescence
  • TreeItem
  • Fenêtre
  • Lien
  • Cases
  • Bouton

L’image suivante montre un conteneur de texte (document) avec une table et une image incorporées.

illustration montrant un document avec une table et une image incorporées

La vue de contenu UI Automation du document précédent est illustrée dans le diagramme suivant.

diagramme de la vue de contenu Ui Automation d’un document avec des objets incorporés

Objets incorporés « compatibles » et « non compatibles »

Certains fournisseurs UI Automation utilisent le même magasin de texte pour chaque objet TextPattern qu’ils contiennent. Les objets soutenus par le même magasin de texte que leur conteneur sont appelés objets incorporés « compatibles ». Ces objets peuvent être des objets TextPattern eux-mêmes et, dans ce cas, leurs plages de texte sont comparables aux plages de texte obtenues à partir de leur conteneur. Cela permet aux fournisseurs d’exposer des informations client sur les objets TextPattern individuels comme s’il s’agissait d’un fournisseur de texte volumineux.

Toutefois, les fournisseurs peuvent utiliser différents magasins de texte pour différents objets TextPattern incorporés dans un conteneur TextPattern. Les objets non sauvegardés par le magasin de texte du conteneur sont appelés objets incorporés « non compatibles ». Ces types d’objets incorporés peuvent ou non être des objets TextPattern.

Le tableau suivant répertorie quelques exemples d’objets incorporés compatibles et non compatibles.

Objets Objets incorporés compatibles Objets incorporés non compatibles
Objets incorporés non TextPattern Bouton dans Microsoft Edge
Table de données dans Microsoft Edge
Bouton dans RichTextBlock dans l’infrastructure XAML de Microsoft
Images avec texte de remplacement dans Microsoft Edge
ListView avec ListItems dans RichTextBlock dans l’infrastructure XAML de Microsoft
Objets incorporés TextPattern Contrôle d’entrée de type « text » dans Microsoft Edge
Tableau dans un document Word
Élément TextBox dans un document Microsoft Word

Exposition d’objets incorporés

Les modèles de contrôle Text et TextRange exposent des propriétés et des méthodes qui facilitent la navigation et l’interrogation d’objets incorporés.

Le contenu textuel (ou texte interne) d’un conteneur de texte et d’un objet incorporé, tel qu’un lien hypertexte ou une cellule de tableau, est exposé en tant que flux de texte unique et continu dans l’affichage de contrôle et l’affichage du contenu de l’arborescence UI Automation. Le contour des objets est ignoré. Si un client UI Automation récupère le texte à réciter, interpréter ou analyser d’une manière ou d’une autre, la plage de texte doit être vérifiée pour des cas spéciaux, tels qu’un tableau contenant du contenu textuel ou d’autres objets incorporés. Appelez IUIAutomationTextRange::GetChildren pour obtenir une interface IUIAutomationElement pour chaque objet incorporé, puis appelez IUIAutomationTextPattern::RangeFromChild pour obtenir une plage de texte pour chaque élément. Cette action se répète jusqu'à ce que tout le contenu textuel ait été récupéré.

Notes

Une plage dégénérée (ou réduite) est l’endroit où le point de terminaison de début et le point de terminaison sont identiques. Les plages dégénérées sont souvent utilisées pour indiquer la position du curseur de texte par le biais des méthodes GetSelection et GetCaretRangeITextProvider.

Le diagramme suivant montre un flux de texte avec des objets incorporés et leurs étendues de plage.

diagramme montrant un flux de texte avec des objets incorporés et leurs étendues de plage

Objets incorporés et TextUnit

Un objet ITextProvider peut être parcouru et par un TextUnit spécifié. Les fournisseurs qui contiennent des objets incorporés peuvent être parcourus de la même manière, mais les objets incorporés affectent la traversée. Voici quelques points à prendre en compte :

  • Tout objet incorporé non compatible est représenté par le caractère de remplacement U+FFFC dans le magasin de texte du TextPattern de l’élément conteneur. Il est également considéré à la fois comme une unité de caractères et une unité de mot.
  • Les objets incorporés compatibles peuvent se composer de plusieurs caractères et mots.
  • L’élément englobant est l’élément le plus bas qui s’étend sur l’ensemble de la plage de texte.
  • Les éléments enfants d’une plage sont également des éléments enfants d’un élément conteneur qui est partiellement ou complètement enfermé dans la plage.
  • Idéalement (en particulier dans le cas d’éléments de conteneur comme Table) une limite de mot ne va pas au-delà de la limite de l’objet. Dans l’exemple suivant, l’unité de mot « Bar » ne contient aucune position de texte qui se trouve en dehors de la </td> balise (<br \> ne fait pas partie du mot « Bar »).
<table style="width:100%">
  <tr>
    <th>Name</th>
    <th>Notes</th>
  </tr>
  <tr>
    <td>Eve Jackson</td>
    <td>Foo Bar</td>
  </tr>
</table>
<br/>
  • En général, <br \> est traité comme un mot individuel de telle sorte qu’il ne va pas au-delà d’une limite de ligne.
  • Une exception à la règle précédente est qu’une unité de texte Word contient des objets complets en elle-même. Par exemple, <p>Hello <a href="#">link</a> here.</p>, qui inclut les conteneurs inline, a les mots « Hello », « link » et « here ». Où « link » a un objet TextPattern comme élément englobant et un objet link comme enfant.
  • Dans le cas des unités de caractère, l’objet est l’élément englobant (les unités de texte comme celle-ci ne doivent pas avoir d’enfants).
  • Les objets d’annotation ne doivent pas être représentés en tant qu’objet incorporé. Par exemple, la présence d’autres spécificateurs d’auteur dans un document co-écrit.
  • Les objets incorporés occupent au moins une position de curseur, l’annotation n’est que des métadonnées.
  • Chaque limite d’objet (début et fin) est représentée par un saut de format dans la plage de documents TextPattern.
  • Pour le code HTML, chaque balise html n’entraîne pas nécessairement un objet UI Automation. Par exemple, le contenu des balises d’accentuation n’a pas besoin d’être représenté en tant qu’élément, mais plutôt en tant que flux de texte où UIA_IsItalicAttributeId retourne TRUE.
  • Le point de terminaison de début est inclusif et est le point de terminaison préféré, tandis que le point de terminaison est exclusif. Cela est utile lorsque la plage dégénère et que les points de terminaison de début et de fin appartiennent à la même position pour cette plage.

Comparaison d’objets incorporés

Les objets TextPattern imbriqués qui se trouvent dans une relation enfant similaire et partagent le même magasin de texte de stockage sont appelés comparables. Dans ce cas, les plages de l’un des objets TextPattern peuvent être comparées à l’aide de ITextRangeProvider::Compare et ITextRangeProvider::CompareEndpoints. Les deux aboutissent à une valeur numérique valide spécifiant leur position relative.

Un objet non TextPattern incorporé dans un objet TextPattern est comparable à TextPattern si l’objet a une plage valide dans le TextPattern (ITextProvider::RangeFromChild) et que le contenu derrière la plage de texte n’est pas vide et n’est pas un caractère de remplacement.

Objets TextPattern incorporés et Document TextUnit

Pour les objets TextPattern incorporés, l’unité Document reconnaît uniquement le contenu contenu dans cet élément.

Word hiérarchie d’éléments TextPattern

  • L’élément document implémente TextPattern et Document retourne l’ensemble de la plage de documents Word.
  • Les pages individuelles du document implémentent TextPattern et Document retourne le contenu de ces pages individuelles (même si les pages partagent le même magasin de texte avec l’ensemble du document TextPattern).

Contrôles d’entrée de page web et de texte dans Edge

  • L’élément Volet main page web implémente TextPattern et expose l’ensemble du contenu de la page web.
  • Les contrôles d’entrée de texte individuels prennent en charge TextPattern où une plage de documents représente le texte contenu dans chaque champ d’entrée (même s’ils partagent le même magasin de texte avec l’ensemble de la page web).

Scénarios courants

Cette section présente des exemples de scénarios courants impliquant des objets incorporés : liens hypertexte, images et tableaux. Dans les exemples suivants, l’accolade gauche ({) représente le point de terminaison De début de la plage de texte, et l’accolade droite (}) représente le point de terminaison De fin.

La plage de texte suivante contient un lien hypertexte de texte incorporé.

{L’URL https://www.microsoft.com est incorporée dans le texte}.

L’appel des méthodes IUIAutomationTextRange::GetText, GetEnclosingElement, GetChildren et IUIAutomationTextPattern::RangeFromChild entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationTextRange::GetText Renvoie la chaîne « L’URL https://www.microsoft.com est incorporée dans le texte ».
IUIAutomationTextRange::GetEnclosingElement Retourne l’élément le plus interne UI Automation qui entoure la plage de texte, dans ce cas, l’élément automation qui représente le fournisseur de texte lui-même.
IUIAutomationTextRange::GetChildren Retourne un élément UI Automation représentant le contrôle de lien hypertexte.
IUIAutomationTextPattern::RangeFromChild, où l’élément UI Automation a été retourné par la méthode IUIAutomationTextRange::GetChildren précédente. Retourne la plage qui représente « https://www.microsoft.com".

La plage de texte suivante couvre partiellement un lien hypertexte de texte incorporé.

L’URL https://{www} est incorporée dans le texte.

L’appel des méthodes IUIAutomationTextRange::GetText, GetEnclosingElement et GetChildren aboutit aux comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationTextRange::GetText Retourne la chaîne « www ».
IUIAutomationTextRange::GetEnclosingElement Retourne l’élément le plus interne UI Automation qui entoure la plage de texte ; dans ce cas, le contrôle de lien hypertexte.
IUIAutomationTextRange::GetChildren Retourne NULL , car la plage de texte ne couvre pas toute la chaîne d’URL.

La plage de texte suivante couvre partiellement le contenu d’un conteneur de texte. Le conteneur de texte a un lien hypertexte textuel incorporé qui ne fait pas partie de la plage de texte.

{L’URL} https://www.microsoft.com est incorporé dans le texte.

L’appel des méthodes IUIAutomationTextRange::GetText, GetEnclosingElement et Move entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationTextRange::GetText Retourne la chaîne « L'URL ».
IUIAutomationTextRange::GetEnclosingElement Retourne l’élément le plus interne UI Automation qui entoure la plage de texte, dans ce cas, l’élément qui représente le fournisseur de texte lui-même.
IUIAutomationTextRange::Move Déplace l’étendue de plage de texte sur « https:// », car le texte du lien hypertexte est composé de mots individuels. Dans ce cas, le lien hypertexte n'est pas traité comme un objet unique.
L’URL {http} est incorporée dans le texte.

Exemple d’image 1 : Plage de texte qui contient une image incorporée

La plage de texte suivante contient une image incorporée d’une navette.

{ L’illustration image d’une navette est incorporée dans du texte}.

L’appel des méthodes IUIAutomationTextRange::GetText, GetEnclosingElement, GetChildren et IUIAutomationTextPattern::RangeFromChild entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationTextRange::GetText Renvoie la chaîne « L’image est incorporée dans le texte ». Tout texte ALT associé à l’image n’est pas inclus dans le flux de texte.
IUIAutomationTextRange::GetEnclosingElement Retourne l’élément le plus interne UI Automation qui entoure la plage de texte, dans ce cas, l’élément qui représente le fournisseur de texte lui-même.
IUIAutomationTextRange::GetChildren Retourne un élément UI Automation représentant le contrôle d’image.
IUIAutomationTextPattern::RangeFromChild où l’élément UI Automation a été retourné par la méthode IUIAutomationTextRange::GetChildren précédente. Retourne la plage dégénérée.

Exemple d’image 2 : Plage de texte qui couvre partiellement le contenu d’un conteneur de texte

La plage de texte suivante couvre partiellement le contenu d’un conteneur de texte. Le conteneur de texte comporte une image incorporée qui ne fait pas partie de la plage de texte.

{L’image} l’illustration d’une navette est incorporée dans du texte.

L’appel des méthodes IUIAutomationTextRange::GetText, GetEnclosingElement et Move entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationTextRange::GetText Retourne la chaîne « L'image ».
IUIAutomationTextRange::GetEnclosingElement Retourne l’élément le plus interne UI Automation qui entoure la plage de texte, dans ce cas, l’élément qui représente le fournisseur de texte lui-même.
IUIAutomationTextRange::Move avec les paramètres de (TextUnit_Word, 2). Déplace la plage de texte vers « est ». Étant donné que seuls les objets incorporés basés sur du texte sont considérés comme faisant partie du flux de texte, l’image de cet exemple n’affecte pas IUIAutomationTextRange::Move ou sa valeur de retour, dans ce cas, 2.

Table de charge de travail

Exemple de tableau 1 : Obtient le conteneur de texte à partir du contenu d’une cellule

Le tableau suivant obtient le conteneur de texte à partir du contenu d’une cellule.

Cellule avec l'image Cellule avec le texte
illustration d’une navette X
illustration de l’espace et d’un télescope O
illustration d’un microscope Z

L’appel des méthodes IUIAutomationGridPattern::GetItem, IUIAutomationTextPattern::RangeFromChild et IUIAutomationTextRange::GetEnclosingElement entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationGridPattern::GetItem avec des paramètres (0, 0). Retourne l’élément UI Automation qui représente le contenu de la cellule de tableau. Dans ce cas, l’élément est un contrôle de texte.
iuiautomationtextpattern::rangefromchild retourne la plage de l’illustration d’image d’une navette.
GetEnclosingElement pour l’objet retourné par la méthode IUIAutomationTextPattern::RangeFromChild précédente. Retourne l’élément UI Automation représentant la cellule du tableau. Dans ce cas, l’élément est un contrôle de texte qui prend en charge le modèle de contrôle TableItem .
IUIAutomationTextRange::GetEnclosingElement pour l’objet retourné par la méthode GetEnclosingElement précédente. Retourne l’élément UI Automation représentant la table.
IUIAutomationTextRange::GetEnclosingElement pour l’objet retourné par la méthode GetEnclosingElement précédente. Retourne l’élément UI Automation qui représente le fournisseur de texte lui-même.

Exemple de tableau 2 : obtient le contenu textuel d’une cellule

Le tableau de l’exemple précédent obtient le contenu textuel d’une cellule.

L’appel des méthodes IUIAutomationGridPattern::GetItem et IUIAutomationTextPattern::RangeFromChild entraîne les comportements décrits dans le tableau suivant.

Méthode appelée Résultats
IUIAutomationGridPattern::GetItem avec des paramètres (1,1). Retourne l’élément UI Automation qui représente le contenu de la cellule de tableau. Dans ce cas, l’élément est un contrôle de texte.
IUIAutomationTextPattern::RangeFromChild où l’élément UI Automation est l’objet retourné par la méthode IUIAutomationGridPattern::GetItem précédente. Retourne « Y ».

Lorsque vous parcourez un document par TextUnit_Line, si la plage de texte entre dans un tableau incorporé, chaque ligne de texte d’une cellule doit être traitée comme une ligne.

Conceptuel