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

découvrez comment créer un conteneur de contrôle 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 Microsoft Active Accessibility hébergés dans votre conteneur de contrôle sont accessibles aux applications clientes de la technologie d’assistance (AT).

Bon à savoir

Technologies

Prérequis

  • C/C++
  • Programmation Microsoft Win32 et COM (Component Object Model)
  • contrôles ActiveX sans fenêtre
  • Serveurs Microsoft Active Accessibility

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 retourner le pointeur IAccessible du contrôle sans fenêtre au système.

Si le conteneur de contrôle a une implémentation de 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 au système.

Étape 2 : répondre au message WM _ GETOBJECT pour le compte du contrôle sans fenêtre.

Lorsqu’une application cliente répond à un WinEvent déclenché par un contrôle sans fenêtre, le conteneur de contrôle reçoit un message WM _ GETOBJECT pour le compte du contrôle. Le message contient 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 de l’objet, puis en appelant la méthode IAccessibleHandler :: AccessibleObjectFromID de ce contrôle. La méthode AccessibleObjectFromID retourne 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 :: obtenir _ 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, QueryObjectIdRangeet 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 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 entre les plages d’ID d’objet et les contrôles sans fenêtre pour lui-même et tous les enfants sans fenêtre. Les plages d’ID de l’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 placer des limites sur le nombre de plages accordées à un contrôle particulier. Toutefois, il est utile d’autoriser plus d’une plage par contrôle pour permettre à un contrôle de croître.

Étape 4 : facultatif : implémentez l’interface IAccessibleHostingElementProviders.

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

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

accessibilité des contrôles ActiveX sans fenêtre