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 인터페이스 포인터를 반환하고 컨트롤 컨테이너는 클라이언트 애플리케이션에 포인터를 전달합니다.
관련 항목