裝載UI自動化無視窗ActiveX控制件
瞭解如何建立控件容器,以裝載實作 Microsoft UI 自動化的無視窗Microsoft ActiveX 控制件。 藉由使用此處所述的步驟,您可以確保控件容器中裝載的任何 UI 自動化無視窗控制項都可存取輔助技術 (AT) 用戶端應用程式。
您需要知道的事項
技術
先決條件
- C/C++
- Microsoft Win32 和元件物件模型 (COM) 程序設計
- 無視窗 ActiveX 控制件
- UI 自動化提供者
說明
步驟 1:為無視窗控制項提供 IRawElementProviderSimple 介面。
每當系統需要無視窗控件根目錄的 IRawElementProviderSimple 指標時,系統就會查詢控制件容器。 若要擷取指標,容器會呼叫無視窗控件實作 IServiceProvider::QueryService 方法。
如果控件容器具有 UI 自動化的實作,它可以將無窗口控制項的 IRawElementProviderSimple 指標傳回給系統。
如果控件容器具有Microsoft Active Accessibility 實作,請呼叫 UiaIAccessibleFromProvider 函式,以取得代表控件的 IAccessible 介面指標,然後將 IAccessible 接口指標傳回給系統。
步驟 2:實作 IRawElementProviderWindowlessSite 介面。
控制容器會實作 IRawElementProviderWindowlessSite 介面,讓基於 UI 自動化的無視窗控件能夠傳達其可及性資訊。
實作 IRawElementProviderWindowlessSite::GetRuntimeIdPrefix。
無視窗控制項片段必須為自己建立唯一的運行時間標識碼。 若要建立其運行時識別碼,無視窗控件片段會通過呼叫控制站點的 GetRuntimeIdPrefix 方法來獲取前置值,然後附加一個相對於無視窗控件中所有其他片段唯一的整數值。
無視窗控件的控件網站應該藉由形成包含常數 UiaAppendRuntimeId的 SAFEARRAY,然後接上對該網站獨有的整數值的方法來實作 GetRuntimeIdPrefix 方法。
這個範例示範如何傳回無視窗控制項的運行時識別碼前綴。
IFACEMETHODIMP CProviderWindowlessSite::GetRuntimeIdPrefix( SAFEARRAY **ppsaPrefix) { if (ppsaPrefix == NULL) { return E_INVALIDARG; } // m_siteIndex is the index of the windowless control's // site. It is defined by the control container. int rId[] = { UiaAppendRuntimeId, m_siteIndex }; SAFEARRAY *psa = SafeArrayCreateVector(VT_I4, 0, 2); if (psa == NULL) { return E_OUTOFMEMORY; } for (LONG i = 0; i < 2; i++) { SafeArrayPutElement(psa, &i, (void*)&(rId[i])); } *ppsaPrefix = psa; return S_OK; }
實作 IRawElementProviderWindowlessSite 的 GetAdjacentFragment 方法。
實作UI自動化的控件必須傳回控件父片段提供者的指標。
若要傳回片段的父代,實作 IRawElementProviderFragment 介面的對象必須能夠實作 Navigate 方法。 對於無窗口控制項來說,實施 Navigate 是很困難的,因為該控制項可能無法判斷其在父物件的可存取樹中的位置。 IRawElementProviderWindowlessSite::GetAdjacentFragment 方法可讓無視窗控件查詢其網站是否有相鄰片段,然後將該片段傳回給呼叫 Navigate的用戶端。
這個範例示範控件容器如何擷取無視窗控件的父片段。
IFACEMETHODIMP CProviderWindowlessSite::GetAdjacentFragment( enum NavigateDirection direction, IRawElementProviderFragment **ppFragment) { if (ppFragment == NULL) { return E_INVALIDARG; } *ppFragment = NULL; HRESULT hr = S_OK; switch (direction) { case NavigateDirection_Parent: { IRawElementProviderSimple *pSimple = NULL; // Call an application-defined function to retrieve the // parent provider interface. hr = GetParentProvider(&pSimple); if (SUCCEEDED(hr)) { // Get the parent's IRawElementProviderFragment interface. hr = pSimple->QueryInterface(IID_PPV_ARGS(ppFragment)); pSimple->Release(); } } break; case NavigateDirection_FirstChild: case NavigateDirection_LastChild: hr = E_INVALIDARG; break; // Ignore NavigateDirection_NextSibling and NavigateDirection_PreviousSibling // because there are no adjacent fragments. default: break; } return hr; }
步驟 3:選擇性:實作 IRawElementProviderHostingAccessibles 介面。
如果您的控件容器具有UI自動化提供者實作,則實作 IRawElementProviderHostingAccessibles 介面,該實作是輔助功能樹狀結構的根目錄,其中包含支援 Microsoft Active Accessibility 的無視窗 ActiveX 控件。 IRawElementProviderHostingAccessibles 介面具有一個方法:GetEmbeddedAccessibles,用於擷取由您的控件容器裝載的所有基於 Microsoft Active Accessibility 的無視窗 ActiveX 控件的 IAccessible 介面指標。
相關主題