Partager via


Utiliser MSAA pour rendre un contrôle ActiveX sans fenêtre accessible

Décrit comment utiliser l’API Microsoft Active Accessibility pour vous assurer que votre contrôle Microsoft ActiveX sans fenêtre est accessible aux applications clientes de 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 : Implémenter l’interface IAccessible.

Pour rendre votre contrôle ActiveX sans fenêtre accessible, vous devez implémenter l’interface IAccessible microsoft Active Accessibility, comme vous le feriez pour un contrôle basé sur une fenêtre, sauf comme décrit dans les étapes suivantes. Pour plus d’informations sur l’implémentation d’IAccessible, consultez le Guide du développeur pour les serveurs d’accessibilité actifs.

Étape 2 : Implémenter l’interface IServiceProvider.

Lorsqu’un client demande des informations d’accessibilité sur votre contrôle sans fenêtre, le conteneur appelle la méthode IServiceProvider::QueryService de votre contrôle pour récupérer le pointeur de l’interface IAccessible .

Cet exemple montre comment implémenter la méthode QueryService .

STDMETHODIMP CMyAccessibleMSAAControl::QueryService(REFGUID guidService, 
        REFIID riid, void **ppvObject)
{      
    if (ppvObject == NULL)
    {
        return E_INVALIDARG;
    }

    *ppvObject = NULL;  
    HRESULT hr = E_FAIL;  

    if (guidService == __uuidof(IAccessible))
    {  
        hr = QueryInterface(riid, ppvObject);  
    }  
    return hr;  
}

Étape 3 : Déléguer les appels de méthode IAccessible::get_accParent à la méthode IAccessibleWindowlessSite::GetParentAccessible du site de contrôle.

Lorsqu’un client demande l’objet parent de votre contrôle sans fenêtre, le conteneur appelle la méthode IAccessible::get_accParent de votre contrôle. Votre implémentation get_accParent doit être déléguée à la méthode IAccessibleWindowlessSite::GetParentAccessible du conteneur.

Cet exemple montre comment implémenter la méthode get_accParent .

HRESULT CMyAccessibleMSAAControl::get_accParent(IDispatch **ppdispParent)  
{  
    if (ppdispParent == NULL)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_FALSE;  
    *ppdispParent = NULL;  

    IAccessibleWindowlessSite *pWindowlessSite = NULL;  

    if (SUCCEEDED(m_pClientSite->QueryInterface(IID_PPV_ARGS(&pWindowlessSite))))  
    {  
        IAccessible *pParentAcc = NULL;
        if (SUCCEEDED(pWindowlessSite->GetParentAccessible(&pParentAcc)))
        {
            hr = pParentAcc->QueryInterface(IID_PPV_ARGS(ppdispParent));  
        }
    }  

    SafeRelease(&pWindowlessSite);
    return hr;  
}

Étape 4 : Acquérir une plage d’ID d’objet à affecter aux sources d’événements dans votre contrôle sans fenêtre.

Comme les contrôles basés sur une fenêtre, un contrôle ActiveX sans fenêtre appelle la fonction NotifyWinEvent pour avertir les clients des événements importants. Les paramètres de fonction incluent l’ID d’objet de l’élément qui déclenche l’événement. Votre contrôle sans fenêtre doit attribuer des ID d’objet à l’aide d’une valeur d’une plage acquise en appelant la méthode IAccessibleWindowlessSite::AcquireObjectIdRange du site de contrôle.

Cet exemple montre comment acquérir une plage de valeurs d’ID d’objet à partir du conteneur de contrôle.

IAccessibleWindowlessSite *pWindowlessSite = NULL;

if (SUCCEEDED(m_pClientSite->QueryInterface(
        IID_PPV_ARGS(&pWindowlessSite))))  
{  
    if (FAILED(pWindowlessSite->AcquireObjectIdRange(100, this, 
            &m_idObjectBase)))  
    {  
        m_idObjectBase = -1;  
    } 
}

SafeRelease(&pWindowlessSite);

Étape 5 : Implémenter l’interface IAccessibleHandler.

Lorsqu’un contrôle sans fenêtre appelle la fonction NotifyWinEvent , le contrôle spécifie l’ID d’objet de l’élément d’interface utilisateur qui déclenche l’événement et spécifie le conteneur de contrôle comme fenêtre qui répondra aux messages WM_GETOBJECT pour le compte du contrôle.

Si une application cliente répond à l’événement, le conteneur de contrôle reçoit un message WM_GETOBJECT qui inclut l’ID d’objet de l’élément d’interface utilisateur 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 retourne le pointeur d’interface IAccessible pour l’élément d’interface utilisateur, et le conteneur de contrôle transfère le pointeur à l’application cliente.

Utiliser UI Automation pour rendre un contrôle ActiveX sans fenêtre accessible

Accessibilité du contrôle ActiveX sans fenêtre