다음을 통해 공유


UI 자동화 및 Microsoft Active Accessibility

비고

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

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

이 항목에서는 UI 자동화의 주요 기능을 포함하고 이러한 기능이 활성 접근성과 어떻게 다른지 설명합니다.

프로그래밍 언어

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

Windows Presentation Foundation 지원

WPF(Windows Presentation Foundation)는 사용자 인터페이스를 만들기 위한 새로운 모델입니다. WPF 요소는 활성 접근성에 대한 네이티브 지원을 포함하지 않습니다. 그러나 활성 접근성 클라이언트에 대한 브리징 지원을 포함하는 UI 자동화를 지원합니다. UI 자동화용으로 특별히 작성된 클라이언트만 텍스트에 대한 풍부한 지원과 같은 WPF의 접근성 기능을 최대한 활용할 수 있습니다.

서버 및 클라이언트

활성 접근성에서 서버와 클라이언트는 주로 서버의 구현 IAccessible을 통해 직접 통신합니다.

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

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

UI 요소

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

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

트리 뷰 및 탐색

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

활성 접근성에서는 최종 사용자와 관련이 없는 많은 자동화 요소가 트리에 노출됩니다. 클라이언트 애플리케이션은 의미 있는 요소를 결정하기 위해 모든 요소를 확인해야 합니다.

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

활성 접근성에서 요소 간 탐색은 공간(예: 화면의 왼쪽에 있는 요소로 이동), 논리적(예: 다음 메뉴 항목으로 이동 또는 대화 상자 내의 탭 순서에서 다음 항목) 또는 계층(예: 컨테이너의 첫 번째 자식 이동 또는 자식에서 부모로 이동)입니다. 계층적 탐색은 자식 요소가 항상 구현 IAccessible하는 개체가 아니라는 사실 때문에 복잡합니다.

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

UI 자동화의 탐색은 활성 접근성보다 더 일관적입니다. 드롭다운 목록 및 팝업 창과 같은 일부 요소는 활성 접근성 트리에 두 번 표시되며 해당 요소에서 탐색하면 예기치 않은 결과가 발생할 수 있습니다. 실제로 Rebar 컨트롤에 대한 활성 접근성을 제대로 구현하는 것은 불가능합니다. UI 자동화를 사용하면 창 소유권에 의해 적용되는 계층 구조에도 불구하고 요소를 트리의 아무 곳에나 배치할 수 있도록 재분석 및 위치 변경이 가능합니다.

역할 및 컨트롤 형식

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

반면, UI 자동화는 요소의 컨트롤 형식을 속성 ControlType으로 설명된 예상되는 기능에서 크게 분리합니다. 기능은 특수화된 인터페이스의 구현을 통해 공급자가 지원하는 컨트롤 패턴에 의해 결정됩니다. 컨트롤 패턴을 결합하여 특정 UI 요소에서 지원하는 전체 기능 집합을 설명할 수 있습니다. 일부 공급자는 특정 컨트롤 패턴을 지원해야 합니다. 예를 들어 확인란의 공급자는 토글 컨트롤 패턴을 지원해야 합니다. 다른 공급자는 하나 이상의 컨트롤 패턴 집합을 지원해야 합니다. 예를 들어 단추는 토글 또는 호출을 지원해야 합니다. 다른 사용자는 컨트롤 패턴을 전혀 지원하지 않습니다. 예를 들어 이동, 크기 조정 또는 도킹할 수 없는 창에는 컨트롤 패턴이 없습니다.

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

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

Active Accessibility 역할 UI 자동화 컨트롤 형식
시스템 푸시 버튼 역할 단추
ROLE_SYSTEM_CLIENT (역할_시스템_클라이언트) 달력
시스템 체크 버튼 역할 확인란
시스템_콤보박스 역할 콤보 상자
ROLE_SYSTEM_CLIENT (역할_시스템_클라이언트) 관습
시스템 역할 목록 데이터 표
시스템_목록항목_역할 데이터 항목
시스템 문서 역할 문서
역할_시스템_텍스트 편집
역할_시스템_그룹화 그룹
시스템 역할 목록 헤더
시스템_열_헤더_역할 헤더 항목
시스템_링크_역할 하이퍼링크
역할_시스템_그래픽 이미지
시스템 역할 목록 목록
시스템_목록항목_역할 목록 항목
시스템 메뉴 팝업 역할 메뉴
시스템 메뉴 막대 역할 메뉴 모음
역할_시스템_메뉴항목 메뉴 항목
시스템 창 역할 패널
시스템 진행 표시줄 역할 진행률 표시줄
라디오 버튼 시스템 역할 라디오 버튼
시스템 스크롤바 역할 스크롤 막대
시스템 구분자 역할 구분 기호
시스템 슬라이더 역할 슬라이더
시스템 스핀 버튼 역할 회전자
역할_시스템_분할버튼 분할 단추
시스템 상태 표시줄 역할 상태 표시줄
시스템_페이지탭리스트 역할
역할_시스템_PAGETAB 탭 항목
시스템_테이블_역할 테이블 / 표
역할_시스템_정적텍스트 문자 메시지
역할_시스템_표시기 엄지손가락
ROLE_SYSTEM_제목 표시줄 제목 표시줄
시스템 도구 모음 역할 도구 모음
시스템 역할 툴팁 툴팁
시스템 윤곽 역할 나무
시스템_윤곽항목_역할 트리 항목
ROLE_SYSTEM_창

다양한 컨트롤 형식에 대한 자세한 내용은 UI 자동화 컨트롤 형식을 참조하세요.

상태 및 속성

활성 접근성에서 요소는 공통 속성 집합을 지원하며 일부 속성(예: accState)은 요소의 역할에 따라 매우 다른 항목을 설명해야 합니다. 서버는 요소와 IAccessible 관련이 없는 메서드라도 속성을 반환하는 모든 메서드를 구현해야 합니다.

UI 자동화는 더 많은 속성을 정의하며, 그 중 일부는 활성 접근성의 상태에 해당합니다. 일부는 모든 요소에 공통적이지만 다른 요소는 컨트롤 형식 및 컨트롤 패턴과 관련이 있습니다. 속성은 고유 식별자에 의해 구분되며, 대부분의 속성은 단일 메서드 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 자동화에서 지원되지 않음

다음 표에서는 활성 접근성 상태 상수에 해당하는 UI 자동화 속성을 보여 줍니다.

Active Accessibility 상태 UI 자동화 속성 상태 변경을 유발합니까?
시스템_상태_확인됨 확인란의 경우 ToggleStateProperty

라디오 버튼의 경우 IsSelectedProperty
Y
시스템 상태가 축소됨 ExpandCollapseState = Collapsed Y
시스템 상태 확장됨 ExpandCollapseState = Expanded 또는 PartiallyExpanded Y
시스템_초점_가능_상태 IsKeyboardFocusableProperty N
시스템_집중_상태 HasKeyboardFocusProperty N
시스템 팝업 상태 ExpandCollapsePattern 메뉴 항목의 경우 N
시스템_상태_비가시적 IsOffscreenProperty = True이고 GetClickablePointNoClickablePointException에 영향을 미칩니다. N
상태_시스템_연결됨 ControlTypeProperty =

Hyperlink
N
시스템_상태_혼합 ToggleState = Indeterminate N
시스템 이동 가능 상태 CanMoveProperty N
시스템_다중_선택가능 CanSelectMultipleProperty N
시스템_화면외_상태 IsOffscreenProperty = 참 N
시스템_보호_상태 IsPasswordProperty N
시스템 읽기 전용 상태 RangeValuePattern.IsReadOnlyPropertyValuePattern.IsReadOnlyProperty N
시스템 선택 가능 상태 SelectionItemPattern가 지원됨 N
STATE_SYSTEM_선택됨 IsSelectedProperty N
시스템 상태 크기 조정 가능 CanResize N
시스템 상태를 사용할 수 없음 IsEnabledProperty Y

다음 상태는 대부분의 활성 접근성 제어 서버에서 구현되지 않았거나 UI 자동화에 해당하지 않습니다.

Active Accessibility 상태 비고
시스템 상태: 바쁨 UI 자동화에서 사용할 수 없음
시스템 기본 상태 UI 자동화에서 사용할 수 없음
시스템 애니메이션 상태 UI 자동화에서 사용할 수 없음
시스템_확장_선택가능_상태 활성 접근성 서버에서 널리 구현되지 않음
STATE_SYSTEM_MARQUEED 활성 접근성 서버에서 널리 구현되지 않음
STATE_SYSTEM_자기 음성화 활성 접근성 서버에서 널리 구현되지 않음
시스템 상태 탐색됨 UI 자동화에서 사용할 수 없음
시스템 경고 상태: 높음 활성 접근성 서버에서 널리 구현되지 않음
시스템 경고 상태 중간 활성 접근성 서버에서 널리 구현되지 않음
시스템 경보 낮음 활성 접근성 서버에서 널리 구현되지 않음
STATE_SYSTEM_FLOATING 활성 접근성 서버에서 널리 구현되지 않음
STATE_SYSTEM_HOTTRACKED (시스템_핫트랙) UI 자동화에서 사용할 수 없음
시스템_눌림_상태 UI 자동화에서 사용할 수 없음

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

이벤트

활성 접근성과 달리 UI 자동화의 이벤트 메커니즘은 Windows 이벤트 라우팅(창 핸들과 밀접하게 연결됨)에 의존하지 않으며 클라이언트 애플리케이션이 후크를 설정할 필요가 없습니다. 이벤트에 대한 구독은 특정 이벤트뿐만 아니라 트리의 특정 부분에 튜닝할 수 있습니다. 또한 공급자는 수신 대기 중인 이벤트를 추적하여 이벤트 발생을 미세 조정할 수 있습니다.

또한 이벤트 콜백에 직접 전달되므로 클라이언트가 이벤트를 발생시키는 요소를 검색하는 것이 더 쉽습니다. 클라이언트가 이벤트를 구독할 때 캐시 요청이 활성화된 경우 요소의 속성이 자동으로 프리페치됩니다.

다음 표에서는 Active Accessibility WinEvents 및 UI 자동화 이벤트의 대응을 보여 줍니다.

WinEvent UI 자동화 이벤트 식별자
이벤트_객체_가속기변경 AcceleratorKeyProperty 속성 변경
객체 내용이 스크롤됨 VerticalScrollPercentProperty 또는 HorizontalScrollPercentProperty 연결된 스크롤 막대의 속성 변경
객체 생성 이벤트 StructureChangedEvent
EVENT_OBJECT_기본작업변경 동등한 항목 없음
이벤트_객체_설명변경 정확히 동등한 항목은 없습니다. HelpTextProperty 또는 LocalizedControlTypeProperty 속성 변경
이벤트_객체_파괴 StructureChangedEvent
EVENT_OBJECT_FOCUS (객체 포커스 이벤트) AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty 변경
객체_숨김_이벤트 StructureChangedEvent
이벤트_객체_위치변경 BoundingRectangleProperty 속성 변경
EVENT_OBJECT_NAMECHANGE (이벤트_객체_이름변경) NameProperty 속성 변경
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER 활성 접근성에서 일관되게 사용되지 않습니다. 직접적인 해당 이벤트가 UI 자동화에 정의되지 않았습니다.
객체 선택 이벤트 ElementSelectedEvent
이벤트_객체_선택추가 ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE(이벤트_객체_선택_제거) ElementRemovedFromSelectionEvent
이벤트_객체_선택내 동등한 항목 없음
이벤트_오브젝트_표시 StructureChangedEvent
이벤트_객체_상태변경 다양한 속성 변경 이벤트
EVENT_OBJECT_VALUECHANGE (이벤트 객체 값 변경) RangeValuePattern.ValuePropertyValuePattern.ValueProperty 변경됨
시스템 경고 이벤트 동등한 항목 없음
이벤트_시스템_캡처종료 동등한 항목 없음
EVENT_SYSTEM_CAPTURESTART (시스템 캡처 시작) 동등한 항목 없음
이벤트_시스템_맥락도움말종료 동등한 항목 없음
시스템_컨텍스트_도움말_시작_이벤트 동등한 항목 없음
시스템_이벤트_다이얼로그종료 WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART (이벤트 시스템 다이얼로그 시작) WindowOpenedEvent
이벤트_시스템_드래그드랍종료 동등한 항목 없음
이벤트_시스템_드래그드롭_시작 동등한 항목 없음
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
시스템 이벤트 메뉴 팝업 종료 MenuClosedEvent
이벤트_시스템_메뉴_팝업_시작 MenuOpenedEvent
이벤트_시스템_메뉴시작 MenuOpenedEvent
EVENT_SYSTEM_최소화종료 WindowVisualStateProperty 속성 변경
시스템_최소화_시작_이벤트 WindowVisualStateProperty 속성 변경
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty 속성 변경
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty 속성 변경
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentProperty 또는 HorizontalScrollPercentProperty 속성 변경
이벤트_시스템_스크롤링시작 VerticalScrollPercentProperty 또는 HorizontalScrollPercentProperty 속성 변경
이벤트_시스템_사운드 동등한 항목 없음
EVENT_SYSTEM_SWITCHEND 동일하지는 않지만 AutomationFocusChangedEvent 이벤트는 새 애플리케이션이 포커스를 받았다는 신호를 표시합니다.
EVENT_SYSTEM_SWITCHSTART 동등한 항목 없음
동등한 항목 없음 CurrentViewProperty 속성 변경
동등한 항목 없음 HorizontallyScrollableProperty 속성 변경
동등한 항목 없음 VerticallyScrollableProperty 속성 변경
동등한 항목 없음 HorizontalScrollPercentProperty 속성 변경
동등한 항목 없음 VerticalScrollPercentProperty 속성 변경
동등한 항목 없음 HorizontalViewSizeProperty 속성 변경
동등한 항목 없음 VerticalViewSizeProperty 속성 변경
동등한 항목 없음 ToggleStateProperty 속성 변경
동등한 항목 없음 WindowVisualStateProperty 속성 변경
동등한 항목 없음 DrawSubItem 이벤트
동등한 항목 없음 ToolTipOpenedEvent

안전

일부 IAccessible 사용자 지정 시나리오에서는 기본 IAccessible 을 래핑하고 이를 통해 호출해야 합니다. 부분적으로 신뢰할 수 있는 구성 요소는 코드 경로의 중개자가 되어서는 안 되므로 보안에 영향을 줍니다.

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

참고하십시오