다음을 통해 공유


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를 구현합니다.

    창 없는 컨트롤 조각 자체에 대 한 고유한 런타임 ID를 만들어야 합니다. 런타임 ID를 만들기 위해 창 없는 컨트롤 조각은 컨트롤 사이트의 GetRuntimeIdPrefix 메서드를 호출하여 접두사 값을 검색한 다음, 창 없는 컨트롤의 다른 모든 조각에 대해 고유한 정수 값을 접두사에 추가합니다.

    창 없는 컨트롤의 컨트롤 사이트는 상수 UiaAppendRuntimeId를 포함하는 SAFEARRAY를 형성한 다음 사이트에 고유한 정수 값을 형성하여 GetRuntimeIdPrefix 메서드를 구현해야 합니다.

    이 예제에서는 창 없는 컨트롤에 대한 런타임 ID 접두사를 반환하는 방법을 보여줍니다.

    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 메서드를 구현할 수 있어야 합니다. 컨트롤이 부모 개체의 액세스 가능한 트리에서 위치를 확인할 수 없으므로 탐색 을 구현하는 것은 창 없는 컨트롤에 어렵습니다. 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 인터페이스를 구현합니다.

컨트롤 컨테이너에 Microsoft Active Accessibility를 지원하는 창 없는 ActiveX 컨트롤이 포함된 접근성 트리의 루트인 UI 자동화 공급자 구현이 있는 경우 IRawElementProviderHostingAccessibles 인터페이스를 구현합니다. IRawElementProviderHostingAccessibles 인터페이스에는 컨트롤 컨테이너에서 호스트하는 모든 Microsoft Active Accessibility 기반 창 없는 ActiveX 컨트롤의 IAccessible 인터페이스 포인터를 검색하는 단일 메서드 GetEmbeddedAccessibles가 있습니다.

MSAA 창 없는 ActiveX 컨트롤을 호스트하는 방법

창 없는 ActiveX 컨트롤 접근성