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