나. 실습: UI 자동화 요소 탐색기

이제 TreeWalker 클래스를 이용하여 UI 자동화 요소를 탐색기를 만들어 봅시다. UI 자동화 요소 탐색기는 프로세스 목록을 확인하여 선택하면 활성화 상태의 컨트롤 요소를 트리 뷰에 표시합시다. 그리고 TreeWalker의 정적 TreeWalker로 탐색하여 트리 뷰 항목을 변경하는 기능을 제공합시다. 또한 트리 뷰의 항목을 선택하였을 때 선택한 노드의 UI 자동화 요소를 레이블에 표시하고 자식, 형제, 부모를 찾아 레이블에 표시하는 기능을 제공합시다.

[그림 4.6] UI 자동화 요소 탐색기 실행 화면
[그림 4.6] UI 자동화 요소 탐색기 실행 화면
 먼저 Windows Forms 응용 프로그램 프로젝트를 생성하시고 UI 자동화 관련 어셈블리를 참조 추가합니다. 그리고 폼에 컨트롤을 배치하세요.

[그림 4.7] 컨트롤 배치
[그림 4.7] 컨트롤 배치
No 컨트롤 이름 컨트롤 형식 No 컨트롤 이름 컨트롤 형식
1 tv_ae TreeView 7 lb_ae_info Label
2 btn_refresh Button 8 btn_first_child Button
3 lbox_process ListBox 9 btn_next Button
4 btn_find_row Button 10 btn_prev Button
5 btn_find_contrl Button 11 btn_last_child Button
6 btn_find_content Button 12 btn_parent Button

[표 4.1] 컨트롤

프로세스 목록을 리스트 상자에 표시하고 선택한 프로세스 정보를 기억할 수 있게 래핑한 프로세스 클래스를 추가합시다.

 

WrapProcesss 클래스에 관한 설명은 초점 제어기에서 다루었습니다. 참고하시기 바랍니다.

[소스 4.1] WrapProcess.cs

 

그리고 AutomationElement의 정보를 표시할 때 컨트롤 이름과 지역화 컨트롤 타입을 조합하여 표시하는 래퍼 클래스를 정의하세요. 이 부분도 초점 제어기에서 설명했던 부분입니다.

[소스 4.2] WrapAE.cs

 

 

이번에는 메인 폼에서 사용자의 명령을 받았을 때 실제 작업을 처리하는 클래스를 정의합시다. 클래스 이름은 UISearcher로 할게요.

 

멤버 필드로 래핑한 자동화 요소가 있고 생성자에서 입력 받은 값으로 기억하게 합시다. UI 자동화 요소 탐색기에서는 특정 프로세스를 선택하였을 때 메인 창의 UI 자동화 요소를 기준으로 탐색할 것입니다. 이를 위해서 선택한 프로세스의 메인 창의 UI 자동화 요소를 래핑한 자동화 요소를 생성자의 입력 인자로 전달받아 멤버 필드 wae를 설정합니다.

초기에 프로세스를 선택하면 선택한 프로세스의 활성화 컨트롤 목록을 트리 뷰에 표시합니다. 이를 위해 활성화 컨트롤을 탐색해 TreeNode에 추가하여 반환하는 기능을 제공합시다.

 

 

 

 

 

 

같은 원리로 나머지 탐색 기능을 구현합니다.

 

[소스 4.3] UISearcher.cs

 

 

이제 폼을 구현할 차례입니다.

 

먼저 프로세스 새로고침 버튼에 클릭 이벤트 핸들러를 추가합니다.

 

전체 찾기 버튼을 클릭했을때 이벤트 핸들러를 추가하세요.

컨트롤 계층 보기 버튼 클릭 이벤트 핸들러를 추가하세요. 내부 기능은 전체 보기 버튼 클릭 이벤트 핸들러와 비슷합니다. 차이가 있는 부분은 UISearch 개체의 FindControlTree 메서드를 호출한다는 점 뿐입니다.

 

컨텐츠 계층 보기 버튼 클릭 이벤트 핸들러를 추가하세요. 내부 기능은 전체 보기 버튼 클릭 이벤트 핸들러와 비슷합니다. 차이가 있는 부분은 UISearch 개체의 FindContentTree 메서드를 호출한다는 점 뿐입니다.

이번에는 탐색 기능들을 구현합시다.

 

먼저 트리 뷰의 선택 항목을 변경했을 때의 이벤트 핸들러를 추가하세요.

 

레이블 테그에 설정한 자동화 요소와 관련 요소를 탐색하는 기능들을 구현합시다. 먼저 첫번째 자식 찾기 클릭 이벤트 핸들러를 추가합니다.

 

나머지 탐색 버튼의 클릭 이벤트 핸들러도 추가합니다. 그리고 탐색 목적에 맞는 UISearcher의 정적 메서드로 탐색후에 자동화 요소 정보 레이블의 속성을 변경합니다. 구현 방법은 첫번째 자식 탐색 버튼 클릭 이벤트 핸들러와 비슷합니다.

 

[소스 4.4] Form1.cs