InvokePattern 요소 제어하기 실습 (WrapLib 클래스 라이브러리 만들기)
앞으로 많은 곳에서 Process를 래핑하거나 자동화 요소를 래핑하는 등의 작업은 중복해서 발생합니다. 매 번 같은 작업을 하는 것은 효과적이지 않아 클래스 라이브러리를 만들어서 사용하기로 할게요. 앞으로 이 라이브러리는 추가 및 변경할 때에만 언급하기로 할게요.
먼저 WrapLib 이름으로 클래스 라이브러리를 추가하세요.
[그림] 클래스 라이브러리 생성
UI 자동화 기술에 관한 .NET 어셈블리를 참조 추가하세요. 솔루션 탐색기의 프로젝트 참조 노드에 오른쪽 마우스 버튼을 클릭하였을 때의 컨텍스트 메뉴에서 참조 추가하세요.
[그림] 참조 추가
기본으로 제공하는 Class1.cs 파일의 속성을 WrapProcess로 변경하세요.
먼저 WrapProcess 클래스를 추가합시다.
class WrapProcess
{
Process 를 래핑할 것이며 이를 위해 자동 속성을 제공합시다.
public Process Process{ get; private set; }
ListBox 목록에 표시할 Title 속성을 제공합시다.
public string Title
{
get
{
return Process.ProcessName+":"+ Process.MainWindowTitle;
}
}
프로세스의 메인 윈도우에 관한 자동화 요소를 제공합시다.
public AutomationElement RootElement
{
get
{
프로세스에 메인 윈도우가 유효하지 않으면 null을 반환합니다.
if (Process.MainWindowHandle == IntPtr.Zero) { return null; }
AutomationElement 클래스의 정적 메서드 FromHandler를 호출하여 메인 윈도우에 관한 자동화 요소를 반환합니다.
return AutomationElement.FromHandle(Process.MainWindowHandle);
}
}
생성자에서는 프로세스 개체를 입력받아 Process 속성에 대입합니다.
public WrapProcess(Process process)
{
Process = process;
}
ToString 메서드를 override 하여 ListBox에 타이틀을 표시할 수 있게 정의합니다.
public override string ToString()
{
return Title;
}
}
using System; using System.Diagnostics; using System.Windows.Automation; namespace WrapLib { /// <summary> /// Process 개체를 래핑한 클래스 /// </summary> public class WrapProcess { /// <summary> /// Process 개체 - 가져오기 /// </summary> public Process Process{ get; private set; } /// <summary> /// 프로세스 이름과 메인 윈도우의 캡션 - 가져오기 /// </summary> public string Title { get { return Process.ProcessName + ":" + Process.MainWindowTitle; } } /// <summary> /// 메인 윈도우와 매핑하는 자동화 요소 - 가져오기 /// </summary> public AutomationElement RootElement { get { if (Process.MainWindowHandle == IntPtr.Zero) { return null; } return AutomationElement.FromHandle(Process.MainWindowHandle); } } /// <summary> /// 생성자 /// </summary> /// <param name="process">래핑할 프로세스 개체</param> public WrapProcess(Process process) { Process = process; } /// <summary> /// ToString 메서드 재정의 /// </summary> /// <returns>Title 속성</returns> public override string ToString() { return Title; } } } |
[소스 5.1] WrapProcess.cs
여기에서는 InvokePattern 을 조사하여 사용할 것입니다. WrapLib 프로젝트에 WrapInvoke 클래스를 추가하세요.
public class WrapInvoke
WrapInvoke 클래스에는 자동화 요소를 래핑할 것이며 이를 참조할 수 있는 속성을 제공합시다.
public AutomationElement AE
{
get;
private set;
}
그리고 자동화 요소의 이름을 가져오기 할 수 있게 속성을 제공합시다.
public string Name
{
get
{
return AE.Current.Name;
}
}
자동화 요소의 지역화 컨트롤 타입명도 가져오기 할 수 있게 속성을 제공합시다.
public string ControlType
{
get
{
return AE.Current.LocalizedControlType;
}
}
생성자는 입력 인자로 래핑할 자동화 요소를 전달받습니다. 그리고 전달받은 자동화 요소를 AE 속성에 설정합니다.
public WrapInvoke(AutomationElement ae)
{
AE = ae;
}
InvokePattern의 Invoke 메서드를 래핑한 메서드를 제공합시다. 메서드 내부에서는 래핑한 자동화 요소 개체가 InvokePattern 개체로 참조한 후에 Invoke 메서드를 호출합니다.
public void Invoke()
{
try
{
InvokePattern inv_pat = AE.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
inv_pat.Invoke();
}
catch { }
}
ToString 메서드도 재정의합시다.
public override string ToString()
{
return ControlType + ":" + Name;
}
using System.Windows.Automation; namespace WrapLib { /// <summary> /// InvokePattern의 자동화 요소 래핑 클래스 /// </summary> public class WrapInvoke { /// <summary> /// 자동화 요소 - 가져오기 /// </summary> public AutomationElement AE{ get; private set; } /// <summary> /// 자동화 요소의 이름 - 가져오기 /// </summary> public string Name { get { return AE.Current.Name; } } /// <summary> /// 자동화 요소의 지역화 컨트롤 타입명 - 가져오기 /// </summary> public string ControlType { get { return AE.Current.LocalizedControlType; } } /// <summary> /// 생성자 /// </summary> /// <param name="ae">래핑할 자동화 요소</param> public WrapInvoke(AutomationElement ae) { AE = ae; } /// <summary> /// 래핑한 InvokePattern의 Invoke 메서드 호출 /// </summary> public void Invoke() { try { InvokePattern inv_pat = AE.GetCurrentPattern( InvokePattern.Pattern) as InvokePattern; inv_pat.Invoke(); } catch { } } /// <summary> /// ToString 메서드 재정의 /// </summary> /// <returns>ControlType 속성과 Name 속성을 합한 문자열</returns> public override string ToString() { return ControlType + ":" + Name; } } } |
[소스 5.2] WrapInvoke.cs
[S/W 접근성] InvokePattern 요소 제어하기 실습 (시나리오)
[S/W 접근성] InvokePattern 요소 제어하기 실습(응용 만들기)
'프로그래밍 기술 > 소프트웨어 접근성, UI 자동화' 카테고리의 다른 글
[S/W 접근성] SelectionPattern, SelectionItemPattern (0) | 2016.04.19 |
---|---|
[S/W 접근성] ScrollPattern, ScrollItemPattern (0) | 2016.04.19 |
[S/W 접근성] Range 값 제어기 실습 (0) | 2016.04.19 |
[S/W 접근성] MultipleViewPattern, RangeValuePattern (0) | 2016.04.19 |
[S/W 접근성] InvokePattern 요소 제어하기 실습(응용 만들기) (0) | 2016.04.19 |
[S/W 접근성] InvokePattern 요소 제어하기 실습 (시나리오) (0) | 2016.04.19 |
[S/W 접근성] InvokePattern (0) | 2016.04.19 |
[S/W 접근성] GridPattern, GridItemPattern (0) | 2016.04.19 |
[S/W 접근성] ExpandCollapsePattern (0) | 2016.04.19 |
[S/W 접근성] DockPattern (0) | 2016.04.19 |