다음을 통해 공유


UI 자동화 및 Microsoft Active Accessibility

참고 항목

이 설명서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI 자동화 클래스를 사용하려는 .NET Framework 개발자를 위한 것입니다. UI 자동화에 대한 최신 정보는 Windows 자동화 API: UI 자동화를 참조하세요.

Microsoft Active Accessibility는 애플리케이션을 액세스할 수 있도록 했던 이전 솔루션입니다. Microsoft UI 자동화는 Microsoft Windows의 새로운 접근성 모델로서 보조 기술 제품 및 자동 테스트 도구의 요구를 충족시키기 위한 것입니다. UI 자동화는 Active Accessibility에 비해 많은 향상된 기능을 제공합니다.

이 항목에서는 UI 자동화의 주요 기능에 대해 설명하고 이러한 기능이 Active Accessibility와 어떻게 다른지 설명합니다.

프로그래밍 언어

Active Accessibility는 이중 인터페이스를 지원하는 COM(구성 요소 개체 모델)을 기준으로 하므로 C/C++, Microsoft Visual Basic 6.0 및 스크립팅 언어로 프로그래밍할 수 있습니다. UI 자동화(표준 컨트롤에 대한 클라이언트 쪽 공급자 라이브러리 포함)은 관리되는 코드로 작성되므로 C# 또는 Visual Basic .NET을 사용하여 UI 자동화 클라이언트 애플리케이션을 쉽게 프로그래밍할 수 있습니다. 인터페이스 구현인 UI 자동화 공급자는 관리되는 코드 또는 C/C++로 작성할 수 있습니다.

Windows Presentation Foundation에서의 지원

WPF(Windows Presentation Foundation)는 사용자 인터페이스를 만들기 위한 새로운 모델입니다. WPF 요소에는 Active Accessibility에 대한 기본 지원이 포함되지 않습니다. 하지만 Active Accessibility 클라이언트에 대한 브리징 지원이 포함된 UI 자동화를 지원합니다. UI 자동화에 대해 특별히 작성된 클라이언트만 WPF의 접근성 기능(예: 다양한 텍스트 지원)을 활용할 수 있습니다.

서버 및 클라이언트

Active Accessibility에서, 서버와 클라이언트 직접 통신하며 이러한 통신은 대부분 서버의 IAccessible 구현을 통해 이루어집니다.

UI 자동화에서, 핵심 서비스는 서버(공급자라고 함)와 클라이언트 사이에 있습니다. 핵심 서비스 공급자는 공급자가 구현한 인터페이스를 호출하고, 요소에 대한 고유한 런타임 식별자 생성 등과 같은 추가적인 서비스를 제공합니다. 클라이언트 애플리케이션은 라이브러리 함수를 사용하여 UI 자동화 서비스를 호출합니다.

UI 자동화 공급자는 Active Accessibility 클라이언트에 정보를 제공할 수 있으며, Active Accessibility 서버는 UI 자동화 클라이언트 애플리케이션에 정보를 제공할 수 있습니다. 그러나 Active Accessibility는 UI 자동화만큼 많은 정보를 노출하지 않기 때문에 두 모델이 완전히 호환되지는 않습니다.

UI 요소

Active Accessibility는 UI 요소를 IAccessible 인터페이스 또는 자식 식별자로 표시합니다. 두 IAccessible 포인터를 비교하여 동일한 요소를 참조하는지 확인하기는 어렵습니다.

UI 자동화에서, 모든 요소는 AutomationElement 개체로 표시됩니다. 요소의 고유한 런타임 식별자를 비교하는 같음 연산자 또는 Equals 메서드를 사용하여 비교합니다.

트리 뷰 및 탐색

화면의 UI(사용자 인터페이스) 요소는 데스크톱이 루트, 애플리케이션 창이 직계 자식, 애플리케이션 내의 요소가 추가적인 하위 항목인 트리 구조로 표시될 수 있습니다.

Active Accessibility에서, 최종 사용자와 관련되지 않은 여러 자동화 요소가 트리에 노출됩니다. 클라이언트 애플리케이션은 모든 요소를 확인하여 의미 있는 요소를 파악해야 합니다.

UI 자동화 클라이언트 애플리케이션은 필터링된 뷰를 통해 UI를 표시합니다. 이 뷰에는 사용자에게 정보를 제공하거나 상호 작용을 활성화하는 등 필요한 요소만 포함됩니다. 컨트롤 요소만 미리 정의된 뷰와 콘텐츠 요소만 미리 정의된 뷰를 사용할 수 있습니다. 또한 애플리케이션이 사용자 지정 뷰를 정의할 수 있습니다. UI 자동화는 사용자에게 UI를 설명하고 애플리케이션과 상호 작용할 수 있도록 도와주는 작업을 간소화합니다.

Active Accessibility에서, 요소 간 탐색은 공간(예: 화면 왼쪽에 있는 요소로 이동), 논리적(예: 다음 메뉴 항목으로 이동 또는 대화 상자 내에서 탭 순서대로 다음 항목으로 이동), 계층적(예: 컨테이너의 첫 번째 자식 이동 또는 자식에서 부모로 이동) 이동 방법 중 하나로 수행됩니다. 계층적 탐색의 경우, 자식 요소가 IAccessible을 구현하는 개체가 아닐 수도 있기 때문에 복잡한 방법입니다.

UI 자동화에서, 모든 UI 요소는 동일한 기본 기능을 지원하는 AutomationElement 개체입니다. 공급자의 관점에서 IRawElementProviderSimple에서 상속된 인터페이스를 구현하는 개체입니다. 탐색은 주로 계층 구조로, 부모에서 자식으로, 한 형제에서 다음 형제로 진행됩니다. (형제 간 탐색에는 탭 순서를 따를 수 있으므로 논리적 요소가 있습니다.) TreeWalker 클래스를 사용하여 트리의 필터링된 보기를 사용하여 모든 시작점에서 탐색할 수 있습니다. FindFirstFindAll을 사용하여 특정 자식 또는 하위 항목을 탐색할 수도 있습니다. 예를 들어, 지정된 컨트롤 패턴을 지원하는 대화 상자 내에서 모든 요소를 쉽게 검색할 수 있습니다.

UI 자동화의 탐색은 Active Accessibility의 경우보다 더 일관성 있게 진행됩니다. 드롭다운 목록 및 팝업 창과 같은 일부 요소는 Active Accessibility 트리에 두 번 나타나며, 이러한 요소를 탐색하면 예기치 않은 결과가 발생할 수 있습니다. 사실상 Rebar 컨트롤에 대해 Active Accessibility를 올바르게 구현하는 것은 불가능합니다. UI 자동화를 사용하면 부모 재지정 및 위치 변경이 가능하므로, 창 소유권에 의해 계층 구조가 적용되더라도 트리에서 요소를 원하는 위치에 배치할 수 있습니다.

역할 및 컨트롤 형식

Active Accessibility는 accRole 속성(IAccessible::get_actRole)을 사용하여 UI에서 ROLE_SYSTEM_SLIDER 또는 ROLE_SYSTEM_MENUITEM과 같은 요소의 역할 설명을 검색합니다. 요소의 역할을 통해 사용 가능한 기능을 알 수 있습니다. IAccessible::accSelectIAccessible::accDoDefaultAction과 같은 고정 메서드를 사용하여 컨트롤과 상호 작용할 수 있습니다. 클라이언트 애플리케이션과 UI 간의 상호 작용은 IAccessible을 통해서 수행할 수 있는 작업으로 제한됩니다.

한편, UI 자동화는 주로 예상 기능에서 요소의 컨트롤 형식(ControlType 속성으로 설명됨)을 분리합니다. 기능은 특수화된 인터페이스의 구현을 통해 공급자가 지원하는 컨트롤 패턴에 의해 결정됩니다. 컨트롤 패턴을 조합하여 특정 UI 요소가 지원하는 전체 기능 집합을 설명할 수 있습니다. 일부 공급자는 특정 컨트롤 패턴을 지원하는 데 필요합니다. 예를 들어, 확인란에 대한 공급자는 Toggle 컨트롤 패턴을 지원해야 합니다. 기타 공급자는 하나 이상의 컨트롤 패턴 집합을 지원하는 데 필요합니다. 예를 들어, 단추는 Toggle 또는 Invoke를 지원해야 합니다. 컨트롤 패턴을 지원하지 않는 공급자도 있습니다. 예를 들어 이동, 크기 조정 또는 도킹할 수 없는 창에는 컨트롤 패턴이 없습니다.

UI 자동화는 Custom 속성으로 식별되고 LocalizedControlTypeProperty 속성으로 설명할 수 있는 사용자 지정 컨트롤을 지원합니다.

다음 표에서는 UI 자동화 컨트롤 형식에 대한 Active Accessibility 역할의 매핑을 보여 줍니다.

Active Accessibility 역할 UI 자동화 컨트롤 형식
ROLE_SYSTEM_PUSHBUTTON 단추
ROLE_SYSTEM_CLIENT Calendar
ROLE_SYSTEM_CHECKBUTTON 확인란
ROLE_SYSTEM_COMBOBOX 콤보 박스
ROLE_SYSTEM_CLIENT 사용자 지정
ROLE_SYSTEM_LIST 데이터 표
ROLE_SYSTEM_LISTITEM 데이터 항목
ROLE_SYSTEM_DOCUMENT 문서
ROLE_SYSTEM_TEXT 편집
ROLE_SYSTEM_GROUPING 그룹
ROLE_SYSTEM_LIST 헤더
ROLE_SYSTEM_COLUMNHEADER 헤더 항목
ROLE_SYSTEM_LINK 하이퍼링크
ROLE_SYSTEM_GRAPHIC 이미지
ROLE_SYSTEM_LIST List
ROLE_SYSTEM_LISTITEM 목록 항목
ROLE_SYSTEM_MENUPOPUP 메뉴
ROLE_SYSTEM_MENUBAR 메뉴 모음
ROLE_SYSTEM_MENUITEM 메뉴 항목
ROLE_SYSTEM_PANE
ROLE_SYSTEM_PROGRESSBAR 진행률 표시줄
ROLE_SYSTEM_RADIOBUTTON 라디오 단추
ROLE_SYSTEM_SCROLLBAR 스크롤 막대
ROLE_SYSTEM_SEPARATOR 구분 기호
ROLE_SYSTEM_SLIDER 슬라이더
ROLE_SYSTEM_SPINBUTTON 회전자
ROLE_SYSTEM_SPLITBUTTON 분할 단추
ROLE_SYSTEM_STATUSBAR 상태 표시줄
ROLE_SYSTEM_PAGETABLIST Tab
ROLE_SYSTEM_PAGETAB 탭 항목
ROLE_SYSTEM_TABLE 테이블
ROLE_SYSTEM_STATICTEXT Text
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR 제목 표시줄
ROLE_SYSTEM_TOOLBAR 도구 모음
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE 트리
ROLE_SYSTEM_OUTLINEITEM 트리 항목
ROLE_SYSTEM_WINDOW

다른 컨트롤 형식에 대한 자세한 내용은 UI Automation Control Types을 참조하세요.

상태 및 속성

Active Accessibility에서, 요소는 속성의 공통 집합을 지원하고 일부 속성(예: accState)은 요소의 역할에 따라 다양한 사항을 설명해야 합니다. 서버는 요소와 관련이 없더라도 속성을 반환하는 IAccessible 의 모든 메서드를 구현해야 합니다.

UI 자동화는 더 많은 속성을 정의하며, 그중 일부는 Active Accessibility에서 상태에 해당합니다. 일부 속성은 모든 요소에 공통되지만 컨트롤 형식과 컨트롤 패턴에만 관련된 속성도 있습니다. 속성은 고유한 식별자로 구분되며, 대부분의 속성은 단일 메서드 GetCurrentPropertyValue 또는 GetCachedPropertyValue를 사용하여 검색할 수 있습니다. CurrentCached 속성 접근자에서 다양한 속성을 쉽게 검색할 수도 있습니다.

UI 자동화 공급자는 관련이 없는 속성을 구현할 필요가 없지만 지원하지 않는 속성에 대해 null 값을 반환할 수 있습니다. 또한 UI 자동화 핵심 서비스는 기본 창 공급자에서 일부 속성을 가져올 수 있으며, 이러한 속성은 공급자가 명시적으로 구현하는 속성과 병합됩니다.

UI 자동화는 기타 여러 속성을 지원하는 것 이외에도 하나의 프로세스 간 호출로 여러 속성을 검색할 수 있도록 허용하여 더 높은 성능을 제공합니다.

다음 표는 두 모델에서 속성 간의 상관 관계를 보여줍니다.

Active Accessibility 속성 접근자 UI 자동화 속성 ID 설명
get_accKeyboardShortcut AccessKeyProperty 또는 AcceleratorKeyProperty 둘 다 있는 경우AccessKeyProperty 가 우선적으로 적용됩니다.
get_accName NameProperty
get_accRole ControlTypeProperty 컨트롤 형식에 대한 역할 매핑은 이전 표를 참조하세요.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
ValuePattern 또는 RangeValuePattern을 지원하는 컨트롤 형식에만 유효합니다. RangeValue 값은 MSAA 동작과 일관되도록 0-100으로 정규화됩니다. 값 항목은 문자열을 사용합니다.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription UI 자동화에서 지원되지 않음 accDescription 은 MSAA 내에서 명확한 사양이 없기 때문에, 공급자가 이 속성에 다양한 정보를 배치합니다.
get_accHelpTopic UI 자동화에서 지원되지 않음

다음 표는 Active Accessibility 상태 상수에 해당하는 UI 자동화 속성을 보여 줍니다.

Active Accessibility 상태 UI 자동화 속성 상태 변경 트리거 여부
STATE_SYSTEM_CHECKED 확인란의 경우, ToggleStateProperty

라디오 단추의 경우, IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded 또는 PartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP 메뉴 항목에 대해ExpandCollapsePattern N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = True이며 GetClickablePointNoClickablePointException N
STATE_SYSTEM_LINKED ControlTypeProperty =

Hyperlink
N
STATE_SYSTEM_MIXED ToggleState = Indeterminate N
STATE_SYSTEM_MOVEABLE CanMoveProperty N
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty N
STATE_SYSTEM_OFFSCREEN IsOffscreenProperty = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyPropertyValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern가 지원됨 N
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

다음 상태는 대부분의 Active Accessibility 컨트롤 서버에서 구현되지 않았거나 UI 자동화에 해당 항목이 없습니다.

Active Accessibility 상태 설명
STATE_SYSTEM_BUSY UI 자동화에서 사용할 수 없음
STATE_SYSTEM_DEFAULT UI 자동화에서 사용할 수 없음
STATE_SYSTEM_ANIMATED UI 자동화에서 사용할 수 없음
STATE_SYSTEM_EXTSELECTABLE Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_MARQUEED Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_SELFVOICING Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_TRAVERSED UI 자동화에서 사용할 수 없음
STATE_SYSTEM_ALERT_HIGH Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_ALERT_MEDIUM Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_ALERT_LOW Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_FLOATING Active Accessibility 서버에서 폭넓게 구현되지 않음
STATE_SYSTEM_HOTTRACKED UI 자동화에서 사용할 수 없음
STATE_SYSTEM_PRESSED UI 자동화에서 사용할 수 없음

UI 자동화 속성 식별자의 전체 목록은 UI 자동화 속성 개요를 참조하세요.

이벤트

Active Accessibility에서와는 달리, UI 자동화의 이벤트 메커니즘은 Windows 이벤트 라우팅(창 핸들과 밀접하게 연결)을 사용하지 않으며 후크를 설정하는 데 클라이언트 애플리케이션이 필요하지 않습니다. 이벤트에 대한 구독은 특정 이벤트뿐만 아니라 트리의 특정 부분에 대해서도 미세하게 조정할 수 있습니다. 공급자는 이벤트가 수신 대기하고 있는 사항을 추적하여 이벤트 발생을 미세 조정할 수 있습니다.

요소가 이벤트 콜백에 직접 전달되므로 클라이언트는 이벤트를 발생하는 요소를 쉽게 검색할 수 있습니다. 클라이언트가 이벤트를 구독할 때 캐시 요청이 활성화되어 있으면 요소의 속성이 자동으로 프리페치됩니다.

다음 표에서는 Active Accessibility WinEvents 및 UI 자동화 이벤트의 상관 관계를 보여 줍니다.

WinEvent UI 자동화 이벤트 식별자
EVENT_OBJECT_ACCELERATORCHANGE AcceleratorKeyProperty 속성 변경
EVENT_OBJECT_CONTENTSCROLLED 연결된 스크롤 막대의VerticalScrollPercentProperty 또는 HorizontalScrollPercentProperty 속성 변경
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE 동일한 요소 없음
EVENT_OBJECT_DESCRIPTIONCHANGE 정확하게 해당하는 요소가 없습니다. HelpTextProperty 또는 LocalizedControlTypeProperty 속성 변경이 이에 해당할 수 있습니다.
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty 변경
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE BoundingRectangleProperty 속성 변경
EVENT_OBJECT_NAMECHANGE NameProperty 속성 변경
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER Active Accessibility에서 일관되게 사용되지 않습니다. 직접적인 해당 이벤트가 UI 자동화에 정의되지 않았습니다.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN 동일한 요소 없음
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE 다양한 속성 변경 이벤트
EVENT_OBJECT_VALUECHANGE RangeValuePattern.ValuePropertyValuePattern.ValueProperty 변경
EVENT_SYSTEM_ALERT 동일한 요소 없음
EVENT_SYSTEM_CAPTUREEND 동일한 요소 없음
EVENT_SYSTEM_CAPTURESTART 동일한 요소 없음
EVENT_SYSTEM_CONTEXTHELPEND 동일한 요소 없음
EVENT_SYSTEM_CONTEXTHELPSTART 동일한 요소 없음
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND 동일한 요소 없음
EVENT_SYSTEM_DRAGDROPSTART 동일한 요소 없음
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND WindowVisualStateProperty 속성 변경
EVENT_SYSTEM_MINIMIZESTART WindowVisualStateProperty 속성 변경
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty 속성 변경
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty 속성 변경
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentProperty or HorizontalScrollPercentProperty 속성 변경
EVENT_SYSTEM_SCROLLINGSTART VerticalScrollPercentProperty or HorizontalScrollPercentProperty 속성 변경
EVENT_SYSTEM_SOUND 동일한 요소 없음
EVENT_SYSTEM_SWITCHEND 동일한 요소가 없지만 AutomationFocusChangedEvent 이벤트는 새 애플리케이션이 포커스를 받았음을 신호로 알립니다.
EVENT_SYSTEM_SWITCHSTART 동일한 요소 없음
동일한 요소 없음 CurrentViewProperty 속성 변경
동일한 요소 없음 HorizontallyScrollableProperty 속성 변경
동일한 요소 없음 VerticallyScrollableProperty 속성 변경
동일한 요소 없음 HorizontalScrollPercentProperty 속성 변경
동일한 요소 없음 VerticalScrollPercentProperty 속성 변경
동일한 요소 없음 HorizontalViewSizeProperty 속성 변경
동일한 요소 없음 VerticalViewSizeProperty 속성 변경
동일한 요소 없음 ToggleStateProperty 속성 변경
동일한 요소 없음 WindowVisualStateProperty 속성 변경
동일한 요소 없음 AsyncContentLoadedEvent 이벤트
동일한 요소 없음 ToolTipOpenedEvent

보안

일부 IAccessible 사용자 지정 시나리오에서는 기본 IAccessible 의 줄바꿈과 이를 호출해야 합니다. 부분적으로 신뢰할 수 있는 구성 요소는 코드 경로에 중간자로 사용할 수 없기 때문에 보안에 영향을 줍니다.

UI 자동화 모델에서는 다른 공급자 코드를 통해 호출하는 데 공급자가 필요하지 않습니다. UI 자동화 핵심 서비스는 필요한 모든 집계를 수행합니다.

참고 항목