다. 실습: 구조 변경 감시자

이번에는 클라이어트용 UI 자동화 이벤트를 이용하여 자식 요소를 추가하거나 제거할 때의 이벤트를 구독하는 구조 변경 감시자 응용 프로그램을 만들어 봅시다.

[그림 6.01] 실행화면
[그림 6.01] 실행화면

구조 변경 감시자 응용에서는 프로세스 목록 새로 고침 버튼을 클릭하면 리스트 박스에 프로세스 목록을 표시합니다. 프로세스 목록 리스트 상자에서 항목을 선택하면 선택한 프로세스의 자동화 요소를 가운데 리스트 상자에 표시합니다. 그리고 선택한 프로세스의 메인 창의 자식 요소를 추가하거나 제거하는 이벤트가 발생하면 이를 마지막 리스트 상자에 표시합니다.

 

이를 위해 UI 자동화 이벤트 중에 구조 변경 이벤트 핸들러를 등록하고 이벤트 인자를 이용하는 실습을 할 것입니다.

 

먼저 컨트롤을 배치합시다.

[그림 6.02] 컨트롤 배치
[그림 6.02] 컨트롤 배치
번호 컨트롤 타입 컨트롤 명 설명
1 Button btn_refresh 프로세스 목록 새로고침 버튼
2 ListBox lbox_process 프로세스 리스트 박스
3 ListBox lbox_ae 자동화 요소 리스트 박스
4 ListBox lbox_event 자동화 이벤트 리스트 박스

[표 6.1] Form1의 컨트롤 배치

 

이 프로젝트에서도 프로세스를 래핑하고 자동화 요소를 래핑하는 부분이 필요합니다. 특히 프로세스를 래핑하는 부분은 5장 InvokePattern 요소 제어기에서 만든 것과 차이가 없습니다. 여기에서는 프로세스 래핑 클래스에 관한 설명은 하지 않겠습니다.

 

그리고 자동화 요소를 래핑하는 부분은 앞에서 했었던 부분과 비슷하지만 구조 변경 이벤트 중에 자식을 삭제할 때 삭제한 자식의 자동화 요소 정보가 null로 전달받아 이를 확인하기 쉽게 약간의 변경 작업이 필요합니다. 이 부분만 별도로 설명하고 넘어가기로 할게요.

 

구조 변경 이벤트 핸드러를 작성합니다.

 

다음은 WrapAE.cs 소스 파일과 WrapProcess.cs 소스 파일의 코드입니다.

 

[소스 6.1] WrapAE.cs

 

[소스 6.2] WrapProcess.cs

 

프로세스 목록 새로고침 클릭 이벤트 핸들러를 추가합시다.

프로세스 목록 선택 변경 이벤트 핸들러를 등록합니다.

구조 변경이 발생하여 자동화 요소 리스트 박스 항목을 설정할 때는 크로스 스레드 문제가 발생합니다. 이를 위해 대리자를 정의하세요.

그리고 자동화 요소 목록을 리스트 박스의 항목에 설정하는 메서드를 구현합시다.

 

구조 변경 이벤트 핸드러를 작성합시다.

 

구조 변경 이벤트 정보를 표시하는 메서드도 크로스 스레드 문제가 발생할 수 있으므로 대리자 형식을 정의합니다.

구조 변경 이벤트 정보를 표시하는 메서드를 구현합시다.

프로세스 리스트 상자에서 선택한 자동화 요소를 래핑한 개체를 반환하는 메서드를 작성하세요. 이 부분은 다른 실습에서도 계속 나온 부분이라 설명을 생략합니다.

마지막으로 폼이 닫힐 때 모든 이벤트 핸들러를 제거합니다.

 

[소스 6.3] Form1.cs