Partager via


Comment héberger un contrôle ActiveX sans fenêtre MSAA

Découvrez comment créer un conteneur de contrôles qui peut héberger des contrôles Microsoft ActiveX sans fenêtre qui implémentent Microsoft Active Accessibility. En suivant les étapes décrites ici, vous pouvez vous assurer que tous les contrôles sans fenêtre basés sur l’accessibilité Active Microsoft hébergés dans votre conteneur de contrôle sont accessibles aux applications clientes de technologie d’assistance (AT).

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Microsoft Win32 et programmation COM (Component Object Model)
  • Contrôles ActiveX sans fenêtre
  • Serveurs d’accessibilité active Microsoft

Instructions

Étape 1 : Fournissez l’interface IAccessible racine pour le compte du contrôle sans fenêtre.

Chaque fois que le système a besoin du pointeur IAccessible pour la racine d’un contrôle sans fenêtre, le système interroge le conteneur de contrôle. Pour récupérer le pointeur, le conteneur appelle l’implémentation du contrôle sans fenêtre de la méthode IServiceProvider::QueryService .

Si le conteneur de contrôle a une implémentation Microsoft Active Accessibility, il peut renvoyer le pointeur IAccessible du contrôle sans fenêtre vers le système.

Si le conteneur de contrôle a une implémentation Microsoft UI Automation, appelez la fonction UiaProviderFromIAccessible pour obtenir un pointeur d’interface IRawElementProviderSimple qui représente le contrôle, puis retournez le pointeur d’interface IRawElementProviderSimple vers le système.

Étape 2 : répondre au message WM_GETOBJECT au nom du contrôle sans fenêtre.

Lorsqu’une application cliente répond à un événement WinEvent déclenché par un contrôle sans fenêtre, le conteneur de contrôle reçoit un message WM_GETOBJECT au nom du contrôle. Le message inclut l’ID d’objet du contrôle sans fenêtre qui a déclenché l’événement.

Le conteneur de contrôle répond en recherchant le contrôle sans fenêtre qui « possède » l’ID d’objet, puis en appelant la méthode IAccessibleHandler::AccessibleObjectFromID de ce contrôle. La méthode AccessibleObjectFromID renvoie le pointeur d’interface IAccessible pour l’élément d’interface utilisateur, et le conteneur de contrôle retourne le pointeur vers le système, qui le transfère à l’application cliente.

Étape 3 : Implémenter l’interface IAccessibleWindowlessSite.

  1. Implémentez la méthode IAccessibleWindowlessSite::GetParentAccessible .

    Lorsqu’une application cliente a besoin d’informations d’accessibilité sur le parent du fournisseur racine du contrôle sans fenêtre, le système appelle la méthode IAccessible::get_accParent du contrôle sans fenêtre. Le contrôle répond en appelant la méthode IAccessibleWindowlessSite::GetParentAccessible du conteneur de contrôle, qui fournit le pointeur IAccessible du parent du contrôle sans fenêtre.

  2. Implémentez les méthodes IAccessibleWindowlessSite::AcquireObjectIdRange, QueryObjectIdRange et ReleaseObjectIdRange .

    Votre conteneur de contrôle doit conserver un mappage des plages d’ID d’objet aux contrôles sans fenêtre. Le mappage permet au conteneur de contrôle d’identifier le contrôle qui doit répondre à une demande particulière pour un ID d’objet. Le tableau suivant montre un exemple de mappage de plages d’ID d’objet à des contrôles sans fenêtre.

    Base de plage Taille de la plage Control
    1 000 500 Contrôle 1
    1500 1 000 Contrôle 2
    2 500 2000 Contrôle 1

     

    Le conteneur de contrôle doit conserver le mappage des plages d’ID d’objet aux contrôles sans fenêtre pour lui-même et tous les enfants sans fenêtre. Les plages d’ID d’objet n’ont pas besoin d’être adjacentes les unes aux autres. En outre, pour éviter les attaques par déni de service, le conteneur de contrôle peut limiter le nombre de plages accordées à un contrôle particulier. Toutefois, il est utile d’autoriser plusieurs plages par contrôle pour permettre à un contrôle de croître.

Étape 4 : Facultative : Implémentez l’interface IAccessibleHostingElementProviders.

Implémentez l’interface IAccessibleHostingElementProviders si votre conteneur de contrôle a une implémentation de serveur Microsoft Active Accessibility et que le serveur est la racine d’une arborescence d’accessibilité qui comprend des contrôles ActiveX sans fenêtre qui prennent en charge UI Automation. L’interface IAccessibleHostingElementProviders a une méthode unique, GetEmbeddedFragmentRoots, qui récupère les pointeurs d’interface IRawElementProviderFragmentRoot de tous les UI Automation contrôles ActiveX sans fenêtre hébergés par votre conteneur de contrôle.

Comment héberger un UI Automation contrôle ActiveX sans fenêtre

Accessibilité du contrôle ActiveX sans fenêtre