서버측 UI 자동화 공급자 구현

업데이트: 2007년 11월

이 단원에서는 사용자 지정 컨트롤의 서버측 UI 자동화 공급자를 구현하는 방법에 대해 설명합니다.

WPF(Windows Presentation Foundation) 요소와 WPF 이외의 요소(Windows Forms을 위해 디자인된 요소 등)는 근본적으로 그 구현 방식이 서로 다릅니다. WPF 요소는 AutomationPeer에서 파생된 클래스를 통해 UI 자동화를 지원합니다. 비 WPF 요소는 공급자 인터페이스 구현을 통해 지원합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 보안 고려 사항
  • Windows Presentation Foundation 요소에 의한 공급자 구현
  • 비 WPF 요소의 공급자 구현
  • 관련 항목

보안 고려 사항

부분 신뢰 환경에서 작동할 수 있도록 공급자를 작성해야 합니다. UIAutomationClient.dll은 부분 신뢰 상태에서 실행하도록 구성되어 있지 않기 때문에 공급자 코드에서 이 어셈블리를 참조해서는 안 됩니다. 이 어셈블리를 참조할 경우 완전 신뢰 환경에서만 코드를 실행할 수 있고 부분 신뢰 환경에서는 코드가 실행되지 않습니다.

특히 AutomationElement에 있는 필드와 같이 UIAutomationClient.dll에 있는 클래스의 필드를 사용해서는 안 됩니다. 대신 AutomationElementIdentifiers와 같이 UIAutomationTypes.dll에 있는 클래스의 동일한 필드를 사용하십시오.

Windows Presentation Foundation 요소에 의한 공급자 구현

이 항목에 대한 자세한 내용은 WPF 사용자 지정 컨트롤의 UI 자동화를 참조하십시오.

비 WPF 요소의 공급자 구현

WPF 프레임워크에 속하지 않지만 관리 코드로 작성된 사용자 지정 컨트롤(대개 Windows Forms 컨트롤)은 인터페이스 구현을 통해 UI 자동화를 지원합니다. 모든 요소는 다음 단원의 첫 번째 표에 나열되어 있는 인터페이스 중 적어도 하나를 구현해야 합니다. 또한 요소가 하나 이상의 컨트롤 패턴을 지원하는 경우 각 컨트롤 패턴에 대한 적절한 인터페이스를 구현해야 합니다.

사용자의 UI 자동화 공급자 프로젝트는 다음 어셈블리를 참조해야 합니다.

  • UIAutomationProviders.dll

  • UIAutomationTypes.dll

  • WindowsBase.dll

이 단원에는 다음 하위 단원이 포함되어 있습니다.

  • 공급자 인터페이스
  • 비 WPF 공급자 요구 사항
  • 비 WPF 공급자의 속성 값
  • 비 WPF 공급자의 이벤트
  • 비 WPF 공급자 탐색
  • 비 WPF 공급자 부모 재지정
  • 비 WPF 공급자 재배치

공급자 인터페이스

모든 UI 자동화 공급자는 다음 인터페이스 중 하나를 구현해야 합니다.

인터페이스

설명

IRawElementProviderSimple

컨트롤 패턴과 속성 지원을 비롯하여 창에서 호스팅되는 단순 컨트롤의 기능을 제공합니다.

IRawElementProviderFragment

IRawElementProviderSimple에서 상속됩니다. 복합 컨트롤에서 조각 내의 탐색, 포커스 설정, 요소의 경계 사각형 반환을 비롯한 요소의 기능을 추가합니다.

IRawElementProviderFragmentRoot

IRawElementProviderFragment에서 상속됩니다. 복합 컨트롤에서 지정한 좌표 내의 자식 요소 검색, 전체 컨트롤에 대한 포커스 상태 설정을 비롯한 루트 요소의 기능을 추가합니다.

다음 인터페이스는 추가 기능을 제공하지만 구현할 필요는 없습니다.

인터페이스

설명

IRawElementProviderAdviseEvents

공급자가 이벤트 요청을 추적할 수 있습니다.

IRawElementProviderHwndOverride

조각의 UI 자동화 트리 내에서 창 기반 요소의 위치를 변경할 수 있습니다.

System.Windows.Automation.Provider 네임스페이스의 다른 모든 인터페이스는 컨트롤 패턴을 지원하는 데 사용됩니다.

비 WPF 공급자 요구 사항

UI 자동화와 통신하려면 컨트롤에서 다음과 같은 기본 기능 영역을 구현해야 합니다.

기능

구현

UI 자동화에 공급자 노출

컨트롤 창에 전송한 WM_GETOBJECT 메시지에 대한 응답으로 IRawElementProviderSimple(또는 파생 인터페이스)을 구현하는 개체를 반환합니다. 조각의 경우 이는 조각 루트의 공급자여야 합니다.

속성 값 제공

값을 제공하거나 재정의하기 위해 GetPropertyValue를 구현합니다.

클라이언트가 컨트롤과 상호 작용하도록 설정

IInvokeProvider 같은 컨트롤 패턴을 지원하는 인터페이스를 구현합니다. GetPatternProvider 구현에서 이러한 패턴 공급자를 반환합니다.

이벤트 발생

AutomationInteropProvider의 정적 메서드 중 하나를 호출하여 클라이언트가 수신할 수 있는 이벤트를 발생시킵니다.

조각 내에서 탐색 및 포커스 사용

조각 내의 각 요소에 대해 IRawElementProviderFragment를 구현합니다. 조각에 속하지 않는 요소에 대해서는 구현할 필요가 없습니다.

조각에서 자식 요소의 포커스 및 배치 사용

IRawElementProviderFragmentRoot를 구현합니다. 조각 루트가 아닌 요소에 대해서는 구현할 필요가 없습니다.

비 WPF 공급자의 속성 값

사용자 지정 컨트롤의 UI 자동화 공급자는 자동화 시스템과 클라이언트 응용 프로그램에서 사용할 수 있는 특정 속성을 지원해야 합니다. 창(HWND)에서 호스팅되는 요소의 경우 UI 자동화는 기본 창 공급자로부터 일부 속성을 가져올 수 있지만 다른 속성은 사용자 지정 공급자로부터 가져와야 합니다.

일반적으로 HWND 기반 컨트롤의 공급자는 다음 속성(필드 값으로 식별됨)을 제공할 필요가 없습니다.

참고:

창에서 호스팅되는 단순 요소나 조각 루트의 RuntimeIdProperty는 창에서 가져오지만 루트 아래에 있는 조각 요소(목록 상자의 목록 항목 등)는 고유한 식별자를 제공해야 합니다. 자세한 내용은 GetRuntimeId를 참조하십시오.

Windows Forms 컨트롤에서 호스팅되는 공급자에 대해 IsKeyboardFocusableProperty가 반환되어야 합니다. 이 경우 기본 창 공급자가 올바른 값을 가져올 수 없습니다.

NameProperty는 대개 호스트 공급자에 의해 제공됩니다. 예를 들어 사용자 지정 컨트롤이 Control에서 파생되면 이름은 컨트롤의 Text 속성에서 파생됩니다.

예제 코드는 UI 자동화 공급자에서 속성 반환을 참조하십시오.

비 WPF 공급자의 이벤트

UI 자동화 공급자는 이벤트를 발생시켜 클라이언트 응용 프로그램에 UI 상태 변경을 알려야 합니다. 이벤트를 발생시키기 위해 다음 메서드가 사용됩니다.

메서드

설명

RaiseAutomationEvent

컨트롤 패턴에서 트리거된 이벤트를 비롯한 다양한 이벤트를 발생시킵니다.

RaiseAutomationPropertyChangedEvent

UI 자동화 속성이 변경되면 이벤트를 발생시킵니다.

RaiseStructureChangedEvent

UI 자동화 트리 구조가 변경되면 이벤트를 발생시킵니다(예: 요소 추가 또는 제거).

이벤트의 목적은 UI(사용자 인터페이스)에서 발생한 이벤트와 UI 자동화 시스템 자체에서 작업을 트리거했는지 여부를 클라이언트에 알리는 것입니다. 예를 들어 컨트롤을 호출할 때마다 직접적인 사용자 입력이나 Invoke를 호출하는 클라이언트 응용 프로그램을 통해 InvokedEvent로 식별되는 이벤트가 발생해야 합니다.

성능을 최적화하기 위해 공급자는 이벤트를 선택적으로 발생시키거나, 이벤트를 수신하도록 등록된 클라이언트 응용 프로그램이 없는 경우에는 이벤트를 전혀 발생시키지 않습니다. 최적화에는 다음 메서드가 사용됩니다.

메서드

설명

ClientsAreListening

이 정적 속성은 클라이언트 응용 프로그램이 UI 자동화 이벤트에 등록되어 있는지 여부를 지정합니다.

IRawElementProviderAdviseEvents

조각 루트에서 이 인터페이스의 공급자 구현을 사용하면 클라이언트가 조각의 이벤트에 대해 이벤트 처리기를 등록하거나 등록을 취소할 때 알림을 받을 수 있습니다.

비 WPF 공급자 탐색

창(HWND)에서 호스팅되는 사용자 지정 단추와 같은 단순 컨트롤의 공급자는 UI 자동화 트리 내의 탐색을 지원할 필요가 없습니다. 요소 간의 탐색은 HostRawElementProvider 구현에 지정되어 있는 호스트 창의 기본 공급자에 의해 처리됩니다. 하지만 복합 사용자 지정 컨트롤의 공급자를 구현할 때는 조각의 루트 노트와 해당 하위 항목, 형제 노드 간의 탐색을 지원해야 합니다.

참고:

루트 이외의 조각 요소는 창에서 직접 호스팅되지 않으며 기본 공급자가 해당 요소 간의 탐색을 지원하지 않기 때문에 HostRawElementProvider에서 null 참조를 반환해야 합니다.

조각의 구조는 Navigate 구현으로 결정됩니다. 각 조각의 가능한 각각의 방향에 대해 이 메서드는 해당 방향의 요소에 대한 공급자 개체를 반환합니다. 특정 방향의 요소가 없는 경우 메서드는 null 참조를 반환합니다.

조각 루트는 자식 요소에 대한 탐색만 지원합니다. 예를 들어 목록 상자는 방향이 FirstChild일 때 첫 번째 항목을 반환하고 방향이 LastChild일 때 마지막 항목을 반환합니다. 조각 루트는 부모나 형제에 대한 탐색을 지원하지 않습니다. 이러한 탐색은 호스트 창 공급자가 처리합니다.

루트가 아닌 조각의 요소는 부모, 형제 및 해당 자식에 대한 탐색을 지원해야 합니다.

비 WPF 공급자 부모 재지정

팝업 창은 실제로 최상위 창이므로 기본적으로 UI 자동화 트리에 데스크톱의 자식으로 나타납니다. 하지만 많은 경우에 팝업 창은 다른 컨트롤의 논리적인 자식입니다. 예를 들어 콤보 상자의 드롭다운 목록은 논리적으로 콤보 상자의 자식입니다. 마찬가지로 메뉴 팝업 창은 논리적으로 메뉴의 자식입니다. UI 자동화는 팝업 창의 부모 재지정을 지원하므로 팝업 창이 관련 컨트롤의 자식으로 나타날 수 있습니다.

팝업 창의 부모를 재지정하려면

  1. 팝업 창의 공급자를 만듭니다. 이 작업을 수행하려면 팝업 창 클래스를 미리 알아야 합니다.

  2. 해당 팝업에 대해 마치 원래 컨트롤인 것처럼 모든 속성과 패턴을 구현합니다.

  3. 매개 변수가 팝업 창의 창 핸들인 HostProviderFromHandle에서 가져온 값을 반환하도록 HostRawElementProvider 속성을 구현합니다.

  4. 팝업 창 및 해당 부모에 대해 Navigate를 구현하여 논리적 부모에서 논리적 자식으로, 형제 자식 간에 탐색이 올바르게 처리되게 만듭니다.

UI 자동화에서 팝업 창이 발견되면 탐색이 기본값에서 재정의되고 있음을 인식하고 데스크톱의 자식으로 발견되면 해당 팝업 창을 건너뜁니다. 이 경우 노드는 조각을 통해서만 도달할 수 있습니다.

컨트롤이 클래스의 창을 호스팅할 수 있는 경우에는 부모 재지정이 적합하지 않습니다. 예를 들어 rebar는 밴드 내에 모든 형식의 HWND를 호스팅할 수 있습니다. 이러한 경우를 처리하기 위해 UI 자동화는 다음 단원에서 설명하는 것처럼 HWND 재배치의 대체 형식을 지원합니다.

비 WPF 공급자 재배치

UI 자동화조각에는 창(HWND)에 포함된 요소가 두 개 이상 포함될 수 있습니다. 각 HWND에는 HWND를 포함 HWND의 자식으로 간주하는 자체적인 기본 공급자가 있으며, UI 자동화 트리는 기본적으로 조각에서 HWND를 부모 창의 자식으로 표시합니다. 대부분의 경우 이것이 바람직한 동작이지만 일부 경우에는 UI의 논리적 구조와 일치하지 않기 때문에 혼란이 발생할 수 있습니다.

이러한 예가 rebar 컨트롤입니다. rebar는 밴드를 포함하며, 밴드는 각각 도구 모음, 입력란, 콤보 상자 같은 HWND 기반 컨트롤을 포함할 수 있습니다. rebar HWND의 기본 창 공급자는 밴드 컨트롤의 HWND를 자식으로 인식하며 rebar 공급자는 밴드를 자식으로 인식합니다. HWND 공급자와 rebar 공급자가 나란히 동작하여 해당 자식을 결합하기 때문에 밴드와 HWND 기반 컨트롤 모두 rebar의 자식으로 나타납니다. 하지만 논리적으로 밴드만 rebar의 자식으로 나타나야 하고 각 밴드 공급자는 포함된 컨트롤의 기본 HWND 공급자와 연결되어야 합니다.

이를 위해서 rebar의 조각 루트 공급자가 밴드를 나타내는 자식 집합을 노출합니다. 각 밴드에는 속성과 패턴을 노출할 수 있는 단일 공급자가 있습니다. HostRawElementProvider의 구현에서 밴드 공급자는 컨트롤의 창 핸들을 전달하여 HostProviderFromHandle을 호출함으로써 얻을 수 있는 컨트롤 HWND의 기본 창 공급자를 반환합니다. 마지막으로 rebar의 조각 루트 공급자는 IRawElementProviderHwndOverride 인터페이스를 구현하며, 해당 GetOverrideProviderForHwnd의 구현에서 지정된 HWND에 포함된 컨트롤의 해당 밴드 공급자를 반환합니다.

참고 항목

작업

서버측 UI 자동화 공급자 노출

UI 자동화 공급자에서 속성 반환

UI 자동화 공급자에서 이벤트 발생

UI 자동화 조각 공급자에서 탐색 사용

UI 자동화 공급자의 컨트롤 패턴 지원

간단한 공급자 샘플

조각 공급자 샘플

개념

UI 자동화 공급자 개요