UI 자동화 및 Active Accessibility
Microsoft Active Accessibility는 Windows 애플리케이션에 액세스할 수 있도록 설계된 레거시 API로, Windows 95에서 도입되었습니다. Microsoft UI 자동화는 보조 기술 제품 및 자동 테스트 도구의 요구를 충족시키기 위한 Windows의 새로운 접근성 모델입니다. Microsoft Active Accessibility에 비해, UI 자동화는 많은 개선 사항을 제공합니다. 두 가지 기술의 차이점을 이 토픽에서 설명합니다.
이 항목에는 다음과 같은 섹션이 포함되어 있습니다.
프로그래밍 언어
이중 인터페이스를 지원하는 COM(구성 요소 개체 모델)을 기반으로 하는 Microsoft Active Accessibility는 C/C++ 및 스크립팅 언어로 프로그래밍할 수 있습니다.
UI 자동화가 도입되었을 때, 클라이언트 API는 관리 코드로 제한되었으며, 관리되는 구현 및 관리되지 않는 구현이 공급자 API에 모두 포함되었습니다. Windows 7에서는 새로운 COM 기반 클라이언트 API가 도입되어 C/C++에서 UI 자동화 클라이언트 애플리케이션을 보다 쉽게 프로그래밍할 수 있도록 했습니다.
서버 및 클라이언트
Microsoft Active Accessibility에서, 주로 IAccessible 인터페이스의 서버 구현을 통해 서버와 클라이언트가 직접 통신합니다.
UI 자동화에서, 서버(공급자)와 클라이언트 사이에 핵심 서비스가 있습니다. 핵심 서비스 공급자는 공급자가 구현한 인터페이스를 호출하며, UI 요소에 대한 고유한 런타임 식별자 생성 등과 같은 추가적인 서비스를 제공합니다. 클라이언트 애플리케이션은 이 핵심 서비스에 액세스하기 위해 CUIAutomation 개체를 만들 수 있습니다. 공급자 인터페이스와 분리된 클라이언트 인터페이스 집합을 이 개체가 지원합니다. CUIAutomation 개체 만들기를 참조하여 자세한 내용을 확인하세요.
UI 자동화 공급자는 Microsoft Active Accessibility 클라이언트에 정보 제공이 가능하며, Microsoft Active Accessibility 서버는 UI 자동화 클라이언트 애플리케이션에 정보 제공이 가능합니다. 하지만 Microsoft Active Accessibility는 UI 자동화만큼 많은 정보를 노출하지 않으므로, 두 모델이 완전히 호환되지는 않습니다.
UI 요소
Microsoft Active Accessibility는 자식 식별자와 쌍을 이루는 IAccessible 인터페이스로 UI 요소를 제공합니다. 두 IAccessible 포인터를 비교하여 동일한 요소를 참조하는지 확인하는 것은 까다롭습니다.
클라이언트에 IUIAutomationElement 인터페이스를 노출하는 개체로 UI 자동화 모든 요소가 표시됩니다. 요소를 비교하기 위해 IUIAutomationElement::GetRuntimeId를 사용하여 검색되는 런타임 식별자를 활용할 수 있습니다.
트리 뷰 및 탐색
데스크톱이 루트, 애플리케이션 창이 직계 자식, 애플리케이션 내의 요소가 추가적인 하위 항목인 트리 구조로 화면의 UI 요소가 표시될 수 있습니다.
Microsoft Active Accessibility에서는 트리 구조에 최종 사용자와 관련이 없는 많은 UI 요소가 노출됩니다. 어떤 요소가 의미가 있는지 확인하기 위해, 클라이언트 애플리케이션은 트리의 모든 요소를 검사해야 합니다.
UI 자동화 클라이언트 애플리케이션은 필터링된 뷰를 통해 UI를 표시합니다. 사용자에게 정보를 제공하거나 사용자가 상호 작용할 수 있는 요소만 보기에 포함됩니다. 제어 요소만 포함된 사전 정의된 보기와 콘텐츠 요소만 포함된 사전 정의된 보기를 사용 가능하며, 클라이언트 애플리케이션에서 사용자 정의 보기에 대한 정의가 가능합니다. UI를 사용자에게 더 쉽게 설명하며, 사용자가 애플리케이션과 상호 작용할 수 있도록 UI 자동화가 도와줍니다.
Microsoft Active Accessibility에서는 요소 간의 탐색이 공간적일 수 있습니다. 예를 들어, 논리적으로, 화면 왼쪽에 있는 요소로 이동하는 경우. 예를 들어, 계층적으로, 다음 메뉴 항목 또는 대화 상자의 탭 순서에서 다음 항목으로 이동하는 경우. 예를 들어, 컨테이너 내의 첫 번째 자식 요소로 이동하거나 자식 요소에서 부모 요소로 이동하는 경우입니다. 계층적 탐색의 경우, 이는 자식 요소가 IAccessible을 구현하는 개체가 아닐 수 있으므로 복잡한 방법입니다.
IUIAutomationElement 인터페이스를 노출하며 동일한 기본 기능을 지원하는 COM 개체가 UI 자동화에서의 모든 UI 요소입니다. 공급자의 관점에서 COM 개체는 IRawElementProviderSimple에서 상속되는 인터페이스를 구현합니다. 탐색은 주로 계층적입니다. 즉, 부모에서 자식으로, 그리고 한 형제에서 다음 형제로 이동합니다. 하지만 형제 간 탐색에는 논리적 요소가 있으며, 탭 순서를 따를 수 있기 때문입니다. 클라이언트는 모든 시작점에서 탐색하기 위해 IUIAutomationTreeWalker를 사용하여 트리의 필터링된 보기를 사용 가능합니다. 또한 클라이언트는 특정 자식 또는 하위 항목으로 이동하기 위해 IUIAutomationElement::FindFirst 및 IUIAutomationElement::FindAll을 사용할 수 있습니다. 예를 들어, 지정된 제어 패턴을 지원하는 대화 상자의 모든 요소를 쉽게 검색 가능합니다.
Microsoft Active Accessibility보다 UI 자동화의 탐색이 더 일관됩니다. 드롭다운 목록 및 팝업 창 등의 일부 요소는 Microsoft Active Accessibility 트리에 두 번 나타나며, 이러한 요소를 탐색하는 경우 예기치 않은 결과가 발생할 수 있습니다. Rebar 제어에 대해 Microsoft Active Accessibility를 제대로 구현하기는 까다롭습니다. UI 자동화를 사용하면 창 소유권에 의해 계층 구조가 적용되더라도 트리에서 요소를 원하는 위치에 배치할 수 있으며, 이는 부모 재지정 및 위치 변경이 가능하기 때문입니다.
역할 및 컨트롤 형식
Microsoft Active Accessibility는 ROLE_SYSTEM_SLIDER 또는 ROLE_SYSTEM_MENUITEM 등의 UI의 요소 역할에 대한 설명을 검색하기 위해 accRole 속성(IAccessible::get_accRole)을 사용합니다. 요소의 역할을 통해 사용 가능한 기능을 알 수 있습니다. IAccessible::accSelect 및 IAccessible::accDoDefaultAction 등의 고정 메서드를 사용하여 제어와의 상호 작용이 수행됩니다. 클라이언트 애플리케이션과 UI 간의 상호 작용은 IAccessible을 통해서 수행할 수 있는 작업으로 제한됩니다.
반면, UI 자동화는 IUIAutomationElement::CurrentControlType(또는 IUIAutomationElement::CachedControlType) 속성에 설명된 요소의 제어 형식을 예상된 기능과 분리합니다. 기능은 특수화된 인터페이스의 구현을 통해 공급자가 지원하는 컨트롤 패턴에 의해 결정됩니다. 특정 UI 요소가 지원하는 전체 기능 집합을 설명하기 위해 제어 패턴을 조합할 수 있습니다. 일부 공급자는 특정한 제어 패턴을 지원해야 합니다. 예를 들어, 확인란의 공급자는 토글 제어 패턴을 지원해야 합니다. 다른 공급자는 하나 이상의 제어 패턴 집합을 지원해야 합니다. 예를 들어, 버튼은 토글 또는 호출 컨트롤 패턴을 지원해야 합니다. 여전히 다른 사용자는 제어 패턴을 지원하지 않습니다. 예를 들어, 제어 패턴은 이동, 크기 조정 또는 도킹할 수 없는 창에는 없습니다.
UI 자동화는 사용자 정의 컨트롤을 지원하며, 이는 UIA_CustomControlTypeId 상수로 식별되고, IUIAutomationElement::CurrentLocalizedControlType(또는 IUIAutomationElement::CachedLocalizedControlType) 속성으로 설명될 수 있습니다.
다음과 같은 표에서 UI 자동화 제어 형식에 Microsoft Active Accessibility 개체 역할을 매핑합니다.
상태 및 속성
Microsoft Active Accessibility 요소는 일반 속성 집합을 지원합니다. 요소 역할에 따라, accState 등의 일부 속성은 다른 조건을 설명해야 합니다. 속성이 요소와 관련이 없더라도, 서버는 속성을 반환하는 IAccessible의 모든 메서드를 구현해야 합니다.
UI 자동화는 추가 속성을 정의하며, Microsoft Active Accessibility의 상태에 그 중 일부가 해당합니다. 일부 속성은 모든 요소에 공통되지만, 컨트롤 형식과 컨트롤 패턴에만 관련된 속성도 있습니다. UI 자동화 공급자는 관련이 없는 속성을 구현할 필요가 없지만, 지원하지 않는 속성에 대해 null 값을 반환할 수 있습니다. UI 자동화 핵심 서비스는 기본 창 공급자에서 일부 속성을 가져올 수 있으며, 공급자가 명시적으로 구현하는 속성과 이러한 속성은 병합됩니다.
더 많은 속성을 지원할 뿐만 아니라, UI 자동화 속성을 캐시할 수 있도록 하여 성능을 향상시킬 수 있습니다.
두 모델에서의 일부 속성 간의 상관 관계를 다음과 같은 표에서 보여 줍니다. 자동화 요소 속성 식별자를 참조하여 UI 자동화 속성 ID에 대한 설명을 확인하세요.
Active Accessibility 속성 접근자 | UI 자동화 속성 ID | 설명 |
---|---|---|
get_accKeyboardShortcut | UIA_AccessKeyPropertyId 또는 UIA_AcceleratorKeyPropertyId | 둘 다 있는 경우 UIA_AccessKeyPropertyId가 우선합니다. |
get_accName | UIA_NamePropertyId | |
get_accRole | UIA_ControlTypePropertyId | 이전의 표를 참조하여 컨트롤 형식에 대한 역할 매핑을 확인하세요. |
get_accValue | UIA_ValueValuePropertyId 또는 UIA_RangeValueValuePropertyId | IUIAutomationValuePattern 또는 IUIAutomationRangeValuePattern을 지원하는 컨트롤 형식에만 유효합니다. Microsoft Active Accessibility 동작과 일치하도록, 범위 값이 0-100으로 정규화됩니다. 값은 문자열로 표시됩니다. |
get_accHelp | UIA_HelpTextPropertyId | |
accLocation | UIA_BoundingRectanglePropertyId | |
get_accDescription | 지원되지 않습니다. | Microsoft Active Accessibility의 명확한 사양이 accDescription에 없으므로, 서버에서 이 속성에 서로 다른 정보를 배치했습니다. |
get_accHelpTopic | 지원되지 않습니다. |
Microsoft Active Accessibility 개체 상태 상수에 해당하는 UI 자동화 속성 ID를 다음 표에서 보여 줍니다.
속성 식별자를 참조하여 속성 ID의 전체 목록을 확인하세요.
이벤트
Microsoft Active Accessibility에서와는 달리, UI 자동화의 이벤트 메커니즘은 창 핸들과 밀접하게 연결된 Windows 이벤트 라우팅을 사용하지 않으며, 후크를 설정하기 위해 클라이언트 애플리케이션이 필요하지 않습니다. 특정 이벤트뿐만 아니라 트리의 특정 부분에 대해서도 이벤트에 대한 구독을 미세하게 조정 가능합니다. 공급자는 이벤트 발생을 미세 조정하기 위해 이벤트가 수신 대기하고 있는 사항을 추적할 수 있습니다.
요소가 이벤트 콜백에 직접 전달되므로, 이벤트를 발생하는 요소를 클라이언트가 쉽게 검색할 수 있습니다. 클라이언트가 이벤트를 구독할 때 캐시 요청이 제공되어 있으면, 자동으로 요소의 속성이 프리페치됩니다.
Microsoft Active Accessibility 이벤트 상수와 UI 자동화 이벤트 ID의 대응을 다음 표에서 보여 줍니다.
UI 자동화 활성 접근성 속성 및 개체에 액세스
단일 프로세스 간 작업으로 여러 속성을 가져오는 기능은 Microsoft Active Accessibility에서 사용할 수 없는 UI 자동화 주요 기능입니다.
기존 Microsoft Active Accessibility 클라이언트는 이 기능을 활용하기 위해 IUIAutomationLegacyIAccessiblePattern 인터페이스를 사용할 수 있습니다. 이 인터페이스는 Microsoft Active Accessibility 속성 및 메서드를 노출하는 컨트롤 패턴을 UI 요소에 표시합니다. 요소를 검색할 때, 이 컨트롤 패턴 및 해당 속성을 캐시할 것을 애플리케이션이 요청할 수 있습니다.
또한 IUIAutomationLegacyIAccessiblePattern을 사용하면 클라이언트가 IAccessible에 대한 네이티브 지원이 없는 요소에서 Microsoft Active Accessibility 속성을 가져올 수 있습니다.
UI 자동화 이벤트는 IUIAutomationLegacyIAccessiblePattern의 속성을 변경해도 발생하지 않습니다.