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 자동화 기반 창 없는 컨트롤이 접근성 정보를 전달할 수 있도록 합니다.
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; }
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가 있습니다.
관련 항목