共用方式為


裝載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 自動化的無視窗控件能夠傳達其可及性資訊。

  1. 實作 IRawElementProviderWindowlessSite::GetRuntimeIdPrefix

    無視窗控制項片段必須為自己建立唯一的運行時間標識碼。 若要建立其運行時識別碼,無視窗控件片段會通過呼叫控制站點的 GetRuntimeIdPrefix 方法來獲取前置值,然後附加一個相對於無視窗控件中所有其他片段唯一的整數值。

    無視窗控件的控件網站應該藉由形成包含常數 UiaAppendRuntimeIdSAFEARRAY,然後接上對該網站獨有的整數值的方法來實作 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;  
    }  
    
  2. 實作 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 介面指標。

如何裝載 MSAA 無視窗 ActiveX 控制件

無視窗 ActiveX 控制件輔助功能