Client-Side (프록시) UI 자동화 공급자 구현Implementing a Client-Side (Proxy) UI Automation Provider

Microsoft UI 자동화는 Microsoft Win32, Windows Forms 및 Windows Presentation Foundation (WPF) 응용 프로그램에서 사용 되는 것과 같은 대부분의 표준 컨트롤에 대 한 프록시 집합을 제공 합니다.Microsoft UI Automation supplies a set of proxies for most standard controls, such as those used in Microsoft Win32, Windows Forms, and Windows Presentation Foundation (WPF) applications. 그러나 많은 사용자 지정 컨트롤 및 타사 컨트롤은 네이티브 UI 자동화 공급자를 구현 하지 않습니다.However, many custom controls and third party controls do not implement native UI Automation providers. UI 자동화 클라이언트 응용 프로그램에서 액세스할 수 있도록 이러한 컨트롤은 클라이언트 쪽 공급자 ( 프록시 공급자 라고도 함) 또는 프록시를 통해 제공 되어야 합니다.To be accessible to UI Automation client applications, these controls must be furnished with client-side providers, also known as proxy providers, or proxies.

이 항목에서는 지원 되지 않는 컨트롤에 대 한 프록시 공급자를 작성 하 여 클라이언트 응용 프로그램에서 사용 하는 프록시 목록에 추가 하는 방법에 대해 설명 합니다.This topic describes how to write a proxy provider for an unsupported control and add it to the list of proxies used by client applications. 다음 항목으로 구성되어 있습니다.It includes the following topics:

프록시 공급자를 구현 하는 방법을 보여 주는 코드 예제는 UI 자동화 공급자를 위한 방법 항목을 참조 하세요.For code examples that show how to implement proxy providers, see How-To Topics for UI Automation Providers.

프록시 란?What is a Proxy?

클라이언트 쪽 공급자 (프록시)는 자체의 IRawElementProviderSimple 구현이 없는 컨트롤을 대신 하 여 IRawElementProviderSimple 인터페이스를 구현 하는 개체입니다.A client-side provider, or proxy, is an object that implements the IRawElementProviderSimple interface on behalf of a control that does not have an IRawElementProviderSimple implementation of its own. 프록시가 없으면 이러한 컨트롤은 주로 UI 자동화에 불투명 하며,이는 컨트롤 위치와 같은 HWND(창 핸들)에서 사용할 수 있는 기본 정보만 제공할 수 있습니다.Without a proxy, such a control is largely opaque to UI Automation, which can supply only basic information available from the window handle (HWND), such as the control location.

프록시 팩터리 란?What is a Proxy Factory?

각 프록시에는 IUIAutomationProxyFactory 인터페이스를 노출 하는 개체인 해당 프록시 팩터리가 필요 합니다.Each proxy requires a corresponding proxy factory, which is an object that exposes the IUIAutomationProxyFactory interface. UI 자동화는 프록시 팩터리 항목 의 내부 테이블을 유지 관리 하며 각 항목은 각 프록시의 프록시 팩터리에 대 한 참조와 조건 집합을 포함 합니다.UI Automation maintains an internal table of proxy factory entries, each of which contains a reference to the proxy factory for each proxy, and a set of conditions. UI 자동화는 네이티브 IRawElementProviderSimple 구현이 없는 컨트롤을 발견 하면 해당 조건이 컨트롤을 지원함을 나타내는 프록시 팩터리 항목을 검색 합니다.When UI Automation encounters a control that does not have a native IRawElementProviderSimple implementation, it searches for a proxy factory entry whose conditions indicate that it supports the control. UI 자동화는 처음부터 테이블을 검색 하 고 일치 하는 항목을 찾으면 UI 자동화는 팩터리의 IUIAutomationProxyFactory:: CreateProvider 메서드를 호출 합니다.UI Automation searches the table from the beginning, and when it finds a matching entry, UI Automation calls the factory's IUIAutomationProxyFactory::CreateProvider method. 일치 프록시가 성공적으로 만들어지면 UI 자동화는 검색을 중지 하 고 새로 만든 프록시 개체를 사용 합니다. 그렇지 않으면 UI 자동화는 검색을 계속 합니다.If the matching proxy is successfully created, the UI Automation stops searching and uses the newly created proxy object; otherwise, UI Automation continues searching.

클라이언트 응용 프로그램은 IUIAutomationProxyFactoryEntry 인터페이스 포인터를 반환 하는 iuiautomation:: CreateProxyFactoryEntry 메서드를 사용 하 여 프록시 팩터리 항목의 인스턴스를 만듭니다.A client application creates an instance of a proxy factory entry by using the IUIAutomation::CreateProxyFactoryEntry method, which returns an IUIAutomationProxyFactoryEntry interface pointer. 클라이언트는 IUIAutomationProxyFactoryEntry 에서 노출 하는 메서드를 사용 하 여 프록시 팩터리가 프록시를 만드는 데 사용 하는 조건 집합을 지정 합니다.Clients use methods exposed by IUIAutomationProxyFactoryEntry to specify the set of conditions that the proxy factory uses for creating the proxy.

IUIAutomationProxyFactory:: CreateProvider를 호출 하는 경우 UI 자동화는 프록시 팩터리 개체에서 프록시가 사용자 지정 컨트롤을 적절 하 게 지원 하는지 여부를 확인 하는 데 사용할 수 있는 매개 변수를 전달 합니다.When it calls IUIAutomationProxyFactory::CreateProvider, UI Automation passes parameters that the proxy factory object can use to determine whether the proxy adequately supports the custom control. 이 경우 프록시 팩터리는 프록시의 인스턴스를 만들고 IRawElementProviderSimple 인터페이스 포인터를 반환 합니다. 그렇지 않으면 NULL 포인터를 반환 합니다.If so, the proxy factory creates an instance of the proxy and returns the IRawElementProviderSimple interface pointer; otherwise, it returns a NULL pointer.

프록시 팩터리 매핑Proxy Factory Mapping

기본적으로 UI 자동화는 다음과 같은 순서로 프록시 팩터리 테이블을 검색 합니다.By default, UI Automation searches through the proxy factory table in the following order.

주문Order Proxy (프록시)Proxy DescriptionDescription
11 Microsoft: 비 제어 프록시Microsoft: Non-Control Proxy 정확한 클래스 이름 또는 기본 클래스 이름 "ComboBoxEx32"를 사용 하는 windows의 경우입니다.For windows with the exact class name or base class name "ComboBoxEx32".
22 Microsoft: 비 제어 프록시Microsoft: Non-Control Proxy 정확한 클래스 이름 또는 기본 클래스 이름 ". n e w"를 사용 하는 windows의 경우For windows with the exact class name or base class name "WorkerW".
33 Microsoft: 비 제어 프록시Microsoft: Non-Control Proxy 정확한 클래스 이름 또는 기본 클래스 이름 "SHELLDLL defview"를 사용 하는 windows의 경우 _ 입니다.For windows with the exact class name or base class name "SHELLDLL_DefView".
44 Microsoft: 컨테이너 프록시Microsoft: Container Proxy 정확한 클래스 이름 또는 기본 클래스 이름 "32770"을 사용 하는 windows의 경우 # 입니다.For windows with the exact class name or base class name "#32770".
55 Microsoft: 컨테이너 프록시Microsoft: Container Proxy "AfxControlBar"가 포함 된 클래스 이름 또는 기본 클래스 이름으로 된 windows의 경우입니다.For windows with a class name or base class name containing "AfxControlBar".
66 Microsoft: TreeView 프록시Microsoft: TreeView Proxy "SysTreeView32"가 포함 된 클래스 이름 또는 기본 클래스 이름으로 된 windows의 경우입니다.For windows with a class name or base class name containing "SysTreeView32".
77 Microsoft: ListView 프록시Microsoft: ListView Proxy 클래스 이름이 나 기본 클래스 이름에 "SysListView32" (1)를 포함 하는 windows의 경우입니다.For windows with a class name or base class name containing "SysListView32" (1).
88 Microsoft: ListView 프록시Microsoft: ListView Proxy 클래스 이름이 나 기본 클래스 이름에 "SysListView32" (2)가 포함 된 windows의 경우입니다.For windows with a class name or base class name containing "SysListView32" (2).
99 Microsoft: MSAA 프록시Microsoft: MSAA Proxy 모든 창For any window.

 

프록시 7과 8은 SysListView32 컨트롤에 대해 중복 된 항목입니다.Proxies 7 and 8 are duplicate entries for the SysListView32 control. 수정 하지 않으면 SysListView32 컨트롤에는 항상 프록시 7이 사용 되며 프록시 8은 사용 되지 않습니다.Without modification, the proxy 7 is always used for the SysListView32 control, and proxy 8 is never used. 프록시 8은 표시 되는 목록 항목에만 사용 되며, 일반적으로 표시 되는 요소에만 작동 하거나 엄격한 성능 요구 사항이 있는 클라이언트 응용 프로그램에서 사용 됩니다.Proxy 8 is used only for visible list items, and is typically used by client applications that work only with visible elements, or that have strict performance requirements. 이러한 클라이언트는 프록시 7을 제거할 수 있습니다.These clients can remove proxy 7.

프록시 9, Microsoft Active Accessibility UI Automation 프록시는 항상 테이블의 마지막 항목 이어야 합니다.Proxy 9, the Microsoft Active Accessibility to UI Automation proxy, should always be the last entry in the table. 이렇게 하면 microsoft Active Accessibility를 구현 하지만 UI 자동화를 구현 하지 않는 컨트롤에 대해 Microsoft Active Accessibility 대체 기능을 사용할 수 있습니다.This enables Microsoft Active Accessibility fallback functionality for controls that implement Microsoft Active Accessibility, but not UI Automation.

프록시 팩터리 테이블에서 항목을 수정 하는 경우 항목의 새 위치를 신중 하 게 평가 해야 합니다.When modifying entries in the proxy factory table, you should carefully evaluate the new position of the entries. 사용자 지정 프록시에 대 한 항목은 비 컨트롤 및 컨테이너 프록시 뒤에 배치 하는 것이 좋습니다. 단, Microsoft는 UI 자동화 프록시로 Active Accessibility 합니다.We recommend that entries for custom proxies be placed after the non-control and container proxies, but before the Microsoft Active Accessibility to UI Automation proxy. 또한 createprovider 호출에 코드가 지정 된 창 핸들 (HWND)을 지원 해야 하는지 여부를 결정 하는 것은 가능 하지만, UI 자동화를 통해 클래스 이름에 따라 프록시를 선택 하 고 createprovider 메서드의 조건부 코드를 최소로 유지 하는 것이 더 효율적입니다.Also, while it is possible to have code in the call to CreateProvider determine whether it should support a given window handle (HWND), it is more efficient to let UI Automation select the proxy based on the class name, and keep conditional code in the CreateProvider method to a minimum.

UI 자동화는 각 클라이언트에 대 한 별도의 프록시 팩터리 테이블을 유지 관리 합니다.UI Automation maintains a separate proxy factory table for each client. 클라이언트에서 프록시 테이블을 변경 하면 변경 내용이 클라이언트 자체에만 영향을 줍니다. 다른 클라이언트는 영향을 받지 않습니다.When a client changes its proxy table, the changes affect only the client itself; other clients are not affected.

기본 프록시 관리Managing Default Proxies

클라이언트 응용 프로그램에서 클라이언트 응용 프로그램을 만들 때 프록시 팩터리 테이블은 처음에 표준 컨트롤의 기본 프록시 공급자에 대 한 항목만 포함 합니다.When a client application creates the CUIAutomation object, the proxy factory table initially contains entries only for the default proxy providers for standard controls. 클라이언트는 IUIAutomationProxyFactoryMapping 인터페이스를 사용 하 여 새 항목을 추가 하 고, 원치 않는 항목을 제거 하 고, 항목의 순서를 변경할 수 있습니다.By using the IUIAutomationProxyFactoryMapping interface, clients can add new entries, remove unwanted entries, change the order of entries, and so on. 클라이언트는 Iuiautomation::P roxyfactorymapping 메서드를 호출 하 여 IUIAutomationProxyFactoryMapping 인터페이스 포인터를 검색할 수 있습니다.A client can retrieve an IUIAutomationProxyFactoryMapping interface pointer by calling the IUIAutomation::ProxyFactoryMapping method.

사용 가능한 프록시 테이블에는 각 프록시에 대 한 IUIAutomationProxyFactoryEntry 인터페이스가 포함 되어 있습니다.The table of available proxies contains an IUIAutomationProxyFactoryEntry interface for each proxy. IUIAutomationProxyFactoryEntry 는 프록시가 제공 하는 IUIAutomationProxyFactory 및 control 클래스를 지정 하 고 이벤트를 처리 하는 방법을 정의 합니다.Each IUIAutomationProxyFactoryEntry specifies the IUIAutomationProxyFactory and the control class that the proxy serves, and defines how events are to be handled.

프록시 테이블은 Iuiautomation::P roxyfactorymapping 속성에서 가져올 수 있는 IUIAutomationProxyFactoryMapping 인터페이스로 표시 됩니다.The table of proxies is represented by an IUIAutomationProxyFactoryMapping interface, which can be obtained from the IUIAutomation::ProxyFactoryMapping property. 응용 프로그램은 IUIAutomationProxyFactoryMapping 메서드를 사용 하 여 프록시를 추가 하 고 삭제할 수 있습니다.An application can use IUIAutomationProxyFactoryMapping methods to add and delete proxies. 이 테이블에 추가할 새 항목을 만들려면 Iuiautomation:: CreateProxyFactoryEntry 를 사용 하 여 인터페이스를 가져온 다음 IUIAutomationProxyFactoryEntry 메서드를 사용 하 여 해당 컨트롤 클래스와 프록시의 동작을 정의 합니다.To create a new entry to add to this table, use IUIAutomation::CreateProxyFactoryEntry to obtain the interface, and then use the IUIAutomationProxyFactoryEntry methods to define the applicable control class and the behavior of the proxy.

Client-Side (프록시) UI 자동화 공급자를 만드는 방법How to Create a Client-Side (Proxy) UI Automation Provider

UI 자동화 공급자 프로그래머 가이드UI Automation Provider Programmer's Guide