使用 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介面指標,而控制項容器會將指標轉送至用戶端應用程式。
相關主題