다음을 통해 공유


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 구현에 대한 자세한 내용은 활성 접근성 서버에 대한 개발자 가이드를 참조하세요.

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단계: 컨트롤 사이트의 IAccessibleWindowlessSite::GetParentAccessible 메서드에 대한 IAccessible::get_accParent 메서드 호출 위임

클라이언트가 창 없는 컨트롤의 부모 개체를 요청하면 컨테이너는 컨트롤의 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단계: 창 없는 컨트롤의 이벤트 원본에 할당할 개체 ID 범위를 가져옵니다.

창 기반 컨트롤과 마찬가지로 창 없는 ActiveX 컨트롤은 NotifyWinEvent 함수를 호출하여 클라이언트에 중요한 이벤트를 알립니다. 함수 매개 변수에는 이벤트를 발생시키는 항목의 개체 ID가 포함됩니다. 창 없는 컨트롤은 컨트롤 사이트의 IAccessibleWindowlessSite::AcquireObjectIdRange 메서드를 호출하여 획득한 범위의 값을 사용하여 개체 ID를 할당해야 합니다.

이 예제에서는 컨트롤 컨테이너에서 개체 ID 값의 범위를 가져오는 방법을 보여줍니다.

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 항목의 개체 ID를 지정하고 컨트롤 컨테이너를 컨트롤을 대신하여 WM_GETOBJECT 메시지에 응답하는 창으로 지정합니다.

클라이언트 애플리케이션이 이벤트에 응답하는 경우 컨트롤 컨테이너는 이벤트를 발생시킨 UI 항목의 개체 ID를 포함하는 WM_GETOBJECT 메시지를 받습니다. 컨트롤 컨테이너는 개체 ID를 "소유"하는 창 없는 컨트롤을 조회한 다음 해당 컨트롤의 IAccessibleHandler::AccessibleObjectFromID 메서드를 호출하여 응답합니다. AccessibleObjectFromID 메서드는 UI 항목에 대한 IAccessible 인터페이스 포인터를 반환하고 컨트롤 컨테이너는 클라이언트 애플리케이션에 포인터를 전달합니다.

UI 자동화 사용하여 창 없는 ActiveX 컨트롤에 액세스할 수 있도록 설정

창 없는 ActiveX 컨트롤 접근성