共用方式為


使用 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的詳細資訊,請參閱 使用中協助工具伺服器的開發人員指南

步驟 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 專案物件識別碼。 控制項容器會藉由查閱「擁有」物件識別碼的無視窗控制項來回應,然後呼叫該控制項的 IAccessibleHandler::AccessibleObjectFromID 方法。 AccessibleObjectFromID方法會傳回 UI 專案的IAccessible介面指標,而控制項容器會將指標轉送至用戶端應用程式。

使用 消費者介面自動化 讓無視窗 ActiveX 控制項可供存取

無視窗 ActiveX 控制項協助工具