共用方式為


裝載消費者介面自動化無視窗 ActiveX 控制項

瞭解如何建立控制項容器,以裝載實作 Microsoft 消費者介面自動化 的無視窗 Microsoft ActiveX 控制項。 藉由使用此處所述的步驟,您可以確保控制項容器中裝載的任何消費者介面自動化無視窗控制項都可以存取輔助技術 (AT) 用戶端應用程式。

您所需了解的事情

技術

必要條件

  • C/C++
  • Microsoft Win32 和元件物件模型 (COM) 程式設計
  • 無視窗 ActiveX 控制項
  • 消費者介面自動化提供者

指示

步驟 1:代表無視窗控制項提供 IRawElementProviderSimple 介面。

每當系統需要無視窗控制項根目錄的 IRawElementProviderSimple 指標時,系統就會查詢控制項容器。 若要擷取指標,容器會呼叫無視窗控制項的 IServiceProvider::QueryService 方法實作。

如果控制項容器具有消費者介面自動化實作,它可以傳回無視窗控制項的IRawElementProviderSimple指標給系統。

如果控制項容器具有 Microsoft Active Accessibility 實作,請呼叫 UiaIAccessibleFromProvider 函 式來取得代表控制項的 IAccessible 介面指標,然後將 IAccessible 介面指標傳回至系統。

步驟 2:實作 IRawElementProviderWindowlessSite 介面。

控制項容器會實作IRawElementProviderWindowlessSite介面,讓以消費者介面自動化為基礎的無視窗控制項傳達其協助工具資訊。

  1. 實作 IRawElementProviderWindowlessSite::GetRuntimeIdPrefix

    無視窗控制片段必須自行建立唯一的執行時間識別碼。 若要建立其執行時間識別碼,無視窗控制項片段會藉由呼叫控制項網站的 GetRuntimeIdPrefix 方法擷取前置詞值,然後附加至前置詞,這個整數值相對於無視窗控制項中所有其他片段是唯一的。

    無視窗控制項的控制項網站應該實作GetRuntimeIdPrefix方法,方法是形成包含常數UiaAppendRuntimeIdSAFEARRAY,後面接著月臺唯一的整數值。

    此範例示範如何傳回無視窗控制項的執行時間識別碼前置詞。

    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 方法。

    實作消費者介面自動化的控制項必須傳回控制項父片段提供者的指標。

    若要傳回片段的父代,實作 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 介面。

如果您的控制項容器具有消費者介面自動化提供者實作,則實作IRawElementProviderHostingAccessibles介面,該實作是協助工具樹狀結構的根目錄,其中包含支援 Microsoft Active Accessibility 的無視窗 ActiveX 控制項。 IRawElementProviderHostingAccessibles介面具有單一方法GetEmbeddedAccessibles,可擷取控制項容器所裝載之所有 Microsoft Active Accessibility 型無視窗 ActiveX 控制項的IAccessible介面指標。

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

無視窗 ActiveX 控制項協助工具