다음을 통해 공유


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

Microsoft Active Accessibility를 구현하는 창 없는 Microsoft ActiveX 컨트롤을 호스트할 수 있는 컨트롤 컨테이너를 만드는 방법을 알아봅니다. 여기에 설명된 단계에 따라 제어 컨테이너에 호스트되는 Microsoft Active Accessibility 기반 창 없는 컨트롤이 AT(보조 기술) 클라이언트 애플리케이션에 액세스할 수 있도록 할 수 있습니다.

알아야 하는 작업

기술

필수 구성 요소

  • C/C++
  • Microsoft Win32 및 COM(구성 요소 개체 모델) 프로그래밍
  • 창 없는 ActiveX 컨트롤
  • Microsoft 활성 접근성 서버

지침

1단계: 창 없는 컨트롤을 대신하여 루트 IAccessible 인터페이스를 제공합니다.

시스템에서 창 없는 컨트롤의 루트에 대한 IAccessible 포인터가 필요할 때마다 시스템은 컨트롤 컨테이너를 쿼리합니다. 포인터를 검색하기 위해 컨테이너는 창 없는 컨트롤의 IServiceProvider::QueryService 메서드 구현을 호출합니다.

컨트롤 컨테이너에 Microsoft Active Accessibility 구현이 있는 경우 창 없는 컨트롤의 IAccessible 포인터를 시스템에 반환할 수 있습니다.

컨트롤 컨테이너에 Microsoft UI 자동화 구현이 있는 경우 UiaProviderFromIAccessible 함수를 호출하여 컨트롤을 나타내는 IRawElementProviderSimple 인터페이스 포인터를 가져온 다음 IRawElementProviderSimple 인터페이스 포인터를 시스템에 반환합니다.

2단계: 창 없는 컨트롤을 대신하여 WM_GETOBJECT 메시지에 응답합니다.

클라이언트 애플리케이션이 창 없는 컨트롤에 의해 발생한 WinEvent에 응답하면 컨트롤 컨테이너는 컨트롤을 대신하여 WM_GETOBJECT 메시지를 받습니다. 메시지에는 이벤트를 발생시킨 창 없는 컨트롤의 개체 ID가 포함됩니다.

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

3단계: IAccessibleWindowlessSite 인터페이스를 구현합니다.

  1. IAccessibleWindowlessSite::GetParentAccessible 메서드를 구현합니다.

    클라이언트 애플리케이션이 창 없는 컨트롤의 루트 공급자의 부모에 대한 접근성 정보가 필요한 경우 시스템은 창 없는 컨트롤의 IAccessible::get_accParent 메서드를 호출합니다. 컨트롤은 창 없는 컨트롤의 부모에 대한 IAccessible 포인터를 제공하는 컨트롤 컨테이너의 IAccessibleWindowlessSite::GetParentAccessible 메서드를 호출하여 응답합니다.

  2. IAccessibleWindowlessSite::AcquireObjectIdRange, QueryObjectIdRangeReleaseObjectIdRange 메서드를 구현합니다.

    컨트롤 컨테이너는 창 없는 컨트롤에 대한 개체 ID 범위의 매핑을 유지해야 합니다. 매핑을 사용하면 컨트롤 컨테이너가 개체 ID에 대한 특정 요청에 응답해야 하는 컨트롤을 식별할 수 있습니다. 다음 표에서는 개체 ID 범위를 창 없는 컨트롤에 매핑하는 예제를 보여 줍니다.

    범위 기준 범위 크기 제어
    1000 500 컨트롤 1
    1500 1000 컨트롤 2
    2500 2000 컨트롤 1

     

    컨트롤 컨테이너는 개체 ID 범위의 매핑을 자체 및 모든 창 없는 자식에 대한 창 없는 컨트롤에 유지 관리해야 합니다. 개체 ID 범위는 서로 인접할 필요가 없습니다. 또한 서비스 거부 공격을 방지하기 위해 컨트롤 컨테이너는 특정 컨트롤에 부여된 범위 수에 제한을 둘 수 있습니다. 그러나 컨트롤당 둘 이상의 범위를 허용하여 컨트롤이 증가할 수 있도록 하는 것이 유용합니다.

4단계: 선택 사항: IAccessibleHostingElementProviders 인터페이스를 구현합니다.

컨트롤 컨테이너에 Microsoft Active Accessibility 서버 구현이 있고 서버가 UI 자동화 지원하는 창 없는 ActiveX 컨트롤을 포함하는 접근성 트리의 루트인 경우 IAccessibleHostingElementProviders 인터페이스를 구현합니다. IAccessibleHostingElementProviders 인터페이스에는 컨트롤 컨테이너에서 호스트하는 모든 UI 자동화 창 없는 ActiveX 컨트롤의 IRawElementProviderFragmentRoot 인터페이스 포인터를 검색하는 단일 메서드 GetEmbeddedFragmentRoots가 있습니다.

UI 자동화 창 없는 ActiveX 컨트롤을 호스트하는 방법

창 없는 ActiveX 컨트롤 접근성