메뉴 건너뛰기

A11Y

# Windows IUIAutomation 기술 소개

## 1. IUIAutomation이란?
IUIAutomation은 Windows UIAutomation API의 COM 기반 인터페이스로, 애플리케이션의 사용자 인터페이스(UI)를 프로그래밍 방식으로 제어하고 자동화하는 데 사용됩니다. 주로 접근성 도구 개발과 UI 테스트 자동화에 활용되며, 다양한 유형의 Windows 애플리케이션과 상호작용할 수 있도록 설계되었습니다.

## 2. 주요 사용 사례
- **접근성 도구 개발**: 스크린 리더, 화면 확대기 등의 접근성 도구에서 UI 요소를 파악하고 상호작용할 수 있습니다.
- **UI 자동화**: 애플리케이션의 UI를 자동으로 테스트하거나 반복적인 작업을 자동화할 수 있습니다.
- **자동화된 상호작용**: 여러 애플리케이션 간의 상호작용을 자동화하거나, 반복적인 작업을 간소화할 때 사용됩니다.

## 3. IUIAutomation의 구조

### (1) **IUIAutomationElement**
- UI의 개별 요소를 나타내는 기본 인터페이스입니다.
- 각 UI 요소는 고유한 속성과 메서드를 가지고 있어 탐색 및 상호작용이 가능합니다.
- 주요 속성: `Name`, `AutomationId`, `ControlType` 등.

### (2) **IUIAutomationPattern**
- UI 요소가 제공하는 특정 기능을 정의하는 패턴입니다. 예를 들어, 버튼의 클릭 동작, 텍스트 상자의 입력 동작을 제어할 수 있습니다.
  - **InvokePattern**: 버튼 클릭 동작을 지원.
  - **ValuePattern**: 텍스트 상자에서 값을 읽고 쓰는 동작을 지원.
  - **ScrollPattern**: 스크롤 가능한 요소를 제어.

### (3) **IUIAutomationCondition**
- 특정 조건에 맞는 UI 요소를 찾기 위한 조건을 정의합니다.
  - **PropertyCondition**: 특정 속성 값에 맞는 UI 요소를 찾는 조건.
  - **AndCondition, OrCondition**: 여러 조건을 결합하여 복잡한 UI 요소를 찾기 위한 조건.

### (4) **IUIAutomationEventHandler**
- UI 요소에서 발생하는 이벤트를 감지하고 처리하는 인터페이스입니다. 예를 들어, 버튼이 클릭되거나 텍스트가 변경되는 등의 이벤트를 처리할 수 있습니다.

## 4. IUIAutomation의 주요 기능

### (1) **UI 요소 탐색**
IUIAutomation은 UI 요소를 계층적으로 탐색할 수 있는 기능을 제공합니다. 각 애플리케이션의 UI는 트리 구조로 되어 있으며, 루트는 데스크톱(Windows Desktop)입니다. 이를 통해 사용자는 특정 애플리케이션 창이나 컨트롤을 찾아내어 상호작용할 수 있습니다.

### (2) **패턴을 통한 상호작용**
IUIAutomation은 다양한 패턴을 통해 UI 요소와 상호작용할 수 있습니다. 패턴은 UI 요소의 기능을 나타내며, 다음과 같은 패턴들이 많이 사용됩니다:
- **InvokePattern**: 버튼 클릭 등 간단한 동작을 수행.
- **ValuePattern**: 텍스트 상자나 숫자 입력 필드의 값을 읽고 쓰는 데 사용.
- **SelectionPattern**: 리스트나 콤보박스와 같은 선택형 컨트롤의 선택 항목을 제어.

### (3) **UI 요소 검색**
IUIAutomation은 다양한 방법으로 UI 요소를 검색할 수 있습니다. 속성 기반 검색을 통해 특정 컨트롤을 찾고 상호작용할 수 있습니다.
```cpp
CComPtr<IUIAutomationElement> pElement;
pAutomation->ElementFromHandle(hWnd, &pElement);
```
위의 코드 예시는 `hWnd` 핸들을 이용해 해당 핸들의 UI 요소를 검색하는 코드입니다.

### (4) **이벤트 핸들링**
IUIAutomation은 UI 요소의 이벤트를 모니터링하고 응답할 수 있는 기능을 제공합니다. 예를 들어, 특정 버튼이 클릭되었을 때 이벤트를 감지할 수 있습니다.
```cpp
pAutomation->AddAutomationEventHandler(UIA_Invoke_InvokedEventId, 
                                       pElement, 
                                       TreeScope_Element, 
                                       NULL, 
                                       pEventHandler);
```
이 코드는 버튼의 클릭 이벤트를 감지하고 처리하는 예제입니다.

## 5. IUIAutomation의 주요 인터페이스 및 메서드

### (1) **IUIAutomation**
- UIAutomation의 핵심 인터페이스로, UI 요소를 검색하고 상호작용하는 기능을 제공합니다.
- 주요 메서드:
  - `ElementFromHandle`: 주어진 윈도우 핸들(`HWND`)로 UI 요소를 검색합니다.
  - `FindAll`: 주어진 조건에 맞는 모든 UI 요소를 찾습니다.

### (2) **IUIAutomationElement**
- UI 요소를 나타내는 인터페이스로, UI 요소의 속성 및 패턴에 접근할 수 있습니다.
- 주요 메서드:
  - `GetCurrentPropertyValue`: 현재 UI 요소의 속성 값을 가져옵니다.
  - `GetCurrentPattern`: UI 요소의 패턴에 접근하여 상호작용할 수 있습니다.

### (3) **IUIAutomationCondition**
- UI 요소를 검색할 때 사용되는 조건을 정의합니다.
  - `PropertyCondition`: 특정 속성 값을 기준으로 요소를 검색.
  - `AndCondition`, `OrCondition`: 여러 조건을 결합하여 복잡한 검색을 수행.

## 6. IUIAutomation 예제 코드

### (1) 윈도우 핸들을 이용한 UI 요소 검색 및 버튼 클릭
```cpp
CComPtr<IUIAutomation> pAutomation;
CComPtr<IUIAutomationElement> pElement;
pAutomation->ElementFromHandle(hWnd, &pElement);

CComPtr<IUIAutomationInvokePattern> pInvokePattern;
pElement->GetCurrentPattern(UIA_InvokePatternId, (IUnknown**)&pInvokePattern);

if (pInvokePattern != nullptr)
{
    pInvokePattern->Invoke();
}
```
이 코드는 특정 핸들(`hWnd`)을 사용해 해당 윈도우의 UI 요소를 검색한 후, 해당 UI 요소가 버튼일 경우 이를 클릭하는 예제입니다.

## 7. IUIAutomation의 장점 및 한계

### 장점
- **접근성 강화**: IUIAutomation은 접근성 도구를 개발하는 데 필수적이며, 장애를 가진 사용자들이 애플리케이션을 보다 쉽게 사용할 수 있게 해줍니다.
- **자동화 효율성**: 반복적인 UI 테스트 및 작업 자동화를 통해 개발자와 테스터의 생산성을 높여줍니다.
- **다양한 애플리케이션 지원**: Windows에서 실행되는 거의 모든 애플리케이션과 상호작용할 수 있습니다.

### 한계
- **복잡한 UI 구조 처리**: UI가 복잡할 경우, UI 요소를 찾고 상호작용하는 것이 어려울 수 있습니다.
- **성능**: 큰 애플리케이션에서는 UI 요소 검색 및 상호작용에 성능 문제가 발생할 수 있습니다.

---

## 8. 결론
IUIAutomation은 Windows 환경에서 접근성 도구 및 UI 자동화 도구를 개발하는 데 중요한 역할을 합니다. 이를 통해 장애가 있는 사용자에게 보다 나은 사용자 경험을 제공할 수 있으며, UI 테스트 및 자동화를 통해 애플리케이션의 품질과 효율성을 높일 수 있습니다.

번호 제목 날짜 조회 수
22 시각장애 개발자와 함께하는 아이디어 마이닝 #9. 마치며 2024.11.22 1
21 시각장애 개발자와 함께하는 아이디어 마이닝 #8. 자바스크립트 2024.11.21 2
20 시각장애 개발자와 함께하는 아이디어 마이닝 #7. 스크립트 예시, CMD 2024.11.20 2
19 시각장애 개발자와 함께하는 아이디어 마이닝 #6. 스크립트 언어 2024.11.19 1
18 시각장애 개발자와 함께하는 아이디어 마이닝 #5. HTML 2024.11.18 2
17 시각장애 개발자와 함께하는 아이디어 마이닝 #4. 의사 코드 2024.11.14 3
16 시각장애 개발자와 함께하는 아이디어 마이닝 #3. 이미지 2024.11.13 3
15 시각장애 개발자와 함께하는 아이디어 마이닝 #2. 텍스트와 오디오 2024.11.12 7
14 [세미나] 시각장애 개발자와 함께 하는 아이디어 마이닝 #1. 목적 2024.11.11 6
13 여러 단계로 이루어진 서비스 제공시 시각장애인 접근성 개선 방안 2024.10.22 40
12 시각장애인과의 협업을 위한 특수문자 발음의 이해 2024.10.18 30
11 센스리더의 브라우저 탭키 환경과 가상커서 탭키 환경 2024.10.11 20
10 센스리더의 "기능 검색" 기능에 대하여 2024.10.08 11
9 시각장애인을 위한 소리 정보 제공 시 기본 파형 사용 주의사항 2024.10.02 13
8 시각장애인 접근성 음성 정보의 맹점 2024.10.02 18
7 시각장애인을 위한 음성 접근성 정보 제공 방법 2024.09.25 27
6 접근성 역할에서 "link"와 "button"의 차이 2024.09.24 27
5 시각장애인 접근성 향상을 위한 응용프로그램 조작 인터페이스 2024.09.11 25
4 윈도우 접근성 기술: MSAA와 UIAutomation 비교 2024.09.09 19
» About: Microsoft Windows IUIAutomation Interface 2024.09.06 11