프로그래밍 기술/소프트웨어 접근성, UI 자동화

[S/W 접근성] InvokePattern 요소 제어하기 실습 (WrapLib 클래스 라이브러리 만들기)

언제나휴일 2016. 4. 19. 14:39
반응형

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;

    }

}

 


WrapProcess.cs


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;

}

 

WrapInvoke.cs


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 요소 제어하기 실습 (시나리오)

[S/W 접근성] InvokePattern 요소 제어하기 실습(응용 만들기)


반응형