共用方式為


使用 MSAA 讓無視窗的 ActiveX 控制件可供存取

描述如何使用 Microsoft Active Accessibility API,以確保您的無視窗Microsoft ActiveX 控制件可供輔助技術 (AT) 用戶端應用程式存取。

您需要知道的事項

技術

先決條件

  • C/C++
  • Microsoft Win32 和元件物件模型 (COM) 程序設計
  • 無窗口 ActiveX 控制件
  • Microsoft Active Accessibility 伺服器

說明

步驟 1:實作 IAccessible 介面。

若要讓您的無視窗 ActiveX 控件可供存取,您必須實作 Microsoft Active Accessibility IAccessible 介面,就像您對於視窗型控件一樣,但如下列步驟所述。 如需實作 IAccessible的詳細資訊,請參閱 Active Accessibility Servers開發人員指南。

步驟 2:實作 IServiceProvider 介面。

當用戶端要求有關無視窗控件的可及性資訊時,容器會呼叫控件的 IServiceProvider::QueryService 方法來擷取 IAccessible 介面指標。

此範例示範如何實作 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;  
}

步驟 3:委派 IAccessible::get_accParent方法呼叫至控件網站的 IAccessibleWindowlessSite::GetParentAccessible 方法。

當用戶端要求無視窗控件的父物件時,容器會呼叫控件的 IAccessible::get_accParent 方法。 您的 get_accParent 實作應該委派給容器的 IAccessibleWindowlessSite::GetParentAccessible 方法。

這個範例示範如何實作 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;  
}

步驟 4:取得一系列對象標識碼,以指派給無視窗控件中的事件來源。

如同視窗型控件,無視窗 ActiveX 控制項會呼叫 NotifyWinEvent 函式,以通知用戶端重要事件。 函式參數包含引發事件之專案的物件標識碼。 您的無視窗控件必須藉由呼叫控件網站的 IAccessibleWindowlessSite::AcquireObjectIdRange 方法,從範圍取得的值來指派對象標識符。

這個範例示範如何從控件容器取得對象標識碼值的範圍。

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

步驟 5:實作 IAccessibleHandler 介面。

當無視窗控件呼叫 NotifyWinEvent 函式時,控件會指定引發事件的 UI 專案物件標識碼,並將控件容器指定為代表控件回應 WM_GETOBJECT 訊息的視窗。

如果用戶端應用程式回應事件,控件容器會收到一則 WM_GETOBJECT 訊息,其中包含引發事件的UI專案物件標識碼。 控件容器會透過查詢擁有該物件ID的無視窗控件來回應,然後呼叫該控件的 IAccessibleHandler::AccessibleObjectFromID 方法。 AccessibleObjectFromID 方法會傳回 UI 專案的 IAccessible 介面指標,而控件容器會將指標轉送至用戶端應用程式。

使用 UI 自動化以增強無窗口 ActiveX 控制件的可存取性

無視窗介面的 ActiveX 控制項無障礙功能