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

[소프트웨어 접근성] 포커스 소유 UI 요소 정보 수집기 만들기 3

언제나휴일 2016. 5. 12. 17:56
반응형

[소프트웨어 접근성] 포커스 소유 UI 요소 정보 수집기 만들기 3




 포커스 변경 이벤트 핸들러인 WrapAutoEvent_ae_dele 메서드를 구현해 봅시다. 여기서는 감시할 프로세스를 설정하지 않은 상태라면 바로 끝냅니다. 그리고 설정되어 있는 상태라면 포커스를 점유한 자동화 요소가 설정 프로세스의 요소인지 확인하여 작업을 수행합니다.

 

 그런데 Windows Form 응용에서 UI 컨트롤을 제어할 수 있는 것은 소유 쓰레드만 가능하므로 크로스 쓰레드 문제를 해결해야 합니다. 만약 컨트롤이나 폼의 InvokeRequiered 속성이 참이라면 현재 쓰레드는 컨트롤이나 폼을 제어할 수 없는 다른 쓰레드입니다. 이럴 때 적적한 대리자와 대리자 수행에 필요한 인자 항목을 넣어 컨트롤이나 폼의 Invoke 메서드를 호출하면 폼이나 컨트롤을 소유한 쓰레드가 대리자를 통해 위임받은 행위를 수행합니다.

 

delegate void SetAEInfoDele(AutomationElement ae);

void WrapAutoEvent_ae_dele(AutomationElement ae)

{

    if (pro == null)

    {

        return;

    }

    if (ae.Current.ProcessId == pro.ID)

    {

        if (this.InvokeRequired)

        {

            object[] objs = new object[1];

            objs[0] = ae;

            this.Invoke(new SetAEInfoDele(SetAEInfo), objs);

        }

    }

}

 

 포커스를 소유한 자동화 요소의 정보는 요소 이름과 요소의 속성, 요소의 패턴을 표시하기로 하였습니다. 여기에서는 자동화 요소를 래핑한 클래스 WrapAE를 만들어 사용하기 쉽게 만들게요.

void SetAEInfo(AutomationElement ae)

{

    WrapAE wae = new WrapAE(ae);

    lb_ae_name.Text = wae.ToString();

    SetAEProperty(wae.AE);

    SetAEPattern(wae);

}

private void SetAEPattern(WrapAE wae)

{

    throw new NotImplementedException();

}

private void SetAEProperty(AutomationElement ae)

{

    throw new NotImplementedException();

}

 

 WrapAE 클래스는 입력 인자로 자동화 요소를 전달받아 어떠한 컨트롤 패턴에 해당하는지 파악하고 이를 쉽게 확인할 수 있는 멤버 메서드를 제공할 것입니다.

public AutomationElement AE

{

    get;

    private set;

}

 

public WrapAE(AutomationElement ae)

{

    AE = ae;

    Parsing();

}

 

 자동화 요소가 어떠한 패턴을 지원하는지 확인하기 위해서는 자동화 요소의 멤버 메서드 TryGetCurrentPattern을 이용합니다. 그리고 WrapAE 클래스에서는 패턴 열거형을 키로하고 패턴을 값으로하는 사전(Dictionary)컬렉션에 보관할게요.

Dictionary<DPType, Object> pt_dic = new Dictionary<DPType, object>();

private void Parsing()

{

    Object obj;

    if (AE.TryGetCurrentPattern(DockPattern.Pattern, out obj))

    {

        pt_dic[DPType.DOCK] = obj as DockPattern;

    }

    ...중간 생략...

}

 

 이를 위해 자동화 요소에서 정의한 패턴들의 타입을 DPType 열거형을 정의하여 사용할게요.

 

namespace 포커스_소유_UI_요소_정보_수집기

{

    public enum DPType

    {

        DP_NONE,

        DOCK, EXPAND_COLLAPSE,

        GRID, GRIDITEM, INVOKE, MULTIPLEVIEW,

        RANGEVALUE, SCROLL, SCROLLITEM, SELECTION,

        SELECTIONITEM, TABLE, TABLEITEM, TEXT,

        TOGGLE, TRANSFORM, VALUE, WINDOW,

        DP_MAX

    }

}

[소스] DPType.cs


 WrapAE 클래스에서는 DPType을 입력 인자로 받아 자동화 컨트롤 패턴을 반환하는 메서드를 제공할게요. 여기서는 이미 분석을 통해 사전에 보관한 개체를 반환하면 됩니다.

public object GetPattern(DPType dptype)

{

    if (pt_dic.ContainsKey(dptype))

    {

        return pt_dic[dptype];

    }

    return null;

}

 

using System;

using System.Collections.Generic;

using System.Windows.Automation;

 

namespace 포커스_소유_UI_요소_정보_수집기

{

    public class WrapAE

    {

        Dictionary<DPType, Object> pt_dic = new Dictionary<DPType, object>();

 

        public AutomationElement AE

        {

            get;

            private set;

        }

        public WrapAE(AutomationElement ae)

        {

            AE = ae;

            Parsing();

        }

 

 

        public object GetPattern(DPType dptype)

        {

            if (pt_dic.ContainsKey(dptype))

            {

                return pt_dic[dptype];

            }

            return null;

        }

 

        public override string ToString()

        {

            try

            {

                return string.Format("{0}:{1}", AE.Current.Name, AE.Current.ClassName);

            }

            catch{     }

            return "N/A";

        }

 

        private void Parsing()

        {

            Object obj;

 

            if (AE.TryGetCurrentPattern(DockPattern.Pattern, out obj))

            {

                pt_dic[DPType.DOCK] = obj as DockPattern;

            }

            if (AE.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out obj))

            {

                pt_dic[DPType.EXPAND_COLLAPSE] = obj as ExpandCollapsePattern;

            }

            if (AE.TryGetCurrentPattern(GridPattern.Pattern, out obj))

            {

                pt_dic[DPType.GRID] = obj as GridPattern;

            }

            if (AE.TryGetCurrentPattern(GridItemPattern.Pattern, out obj))

            {

                pt_dic[DPType.GRIDITEM] = obj as GridItemPattern;

            }

            if (AE.TryGetCurrentPattern(InvokePattern.Pattern, out obj))

            {

                pt_dic[DPType.INVOKE] = obj as InvokePattern;

            }

            if (AE.TryGetCurrentPattern(MultipleViewPattern.Pattern, out obj))

            {

                pt_dic[DPType.MULTIPLEVIEW] = obj as MultipleViewPattern;

            }

            if (AE.TryGetCurrentPattern(RangeValuePattern.Pattern, out obj))

            {

                pt_dic[DPType.RANGEVALUE] = obj as RangeValuePattern;

            }

            if (AE.TryGetCurrentPattern(ScrollPattern.Pattern, out obj))

            {

                pt_dic[DPType.SCROLL] = obj as ScrollPattern;

            }

            if (AE.TryGetCurrentPattern(ScrollItemPattern.Pattern, out obj))

            {

                pt_dic[DPType.SCROLLITEM] = obj as ScrollItemPattern;

            }

 

 

 

            if (AE.TryGetCurrentPattern(SelectionPattern.Pattern, out obj))

            {

                pt_dic[DPType.SELECTION] = obj as SelectionPattern;

            }

            if (AE.TryGetCurrentPattern(SelectionItemPattern.Pattern, out obj))

            {

                pt_dic[DPType.SELECTIONITEM] = obj as SelectionItemPattern;

            }

            if (AE.TryGetCurrentPattern(TablePattern.Pattern, out obj))

            {

                pt_dic[DPType.TABLE] = obj as TablePattern;

            }

            if (AE.TryGetCurrentPattern(TableItemPattern.Pattern, out obj))

            {

                pt_dic[DPType.TABLEITEM] = obj as TableItemPattern;

            }

            if (AE.TryGetCurrentPattern(TextPattern.Pattern, out obj))

            {

                pt_dic[DPType.TEXT] = obj as TextPattern;

            }

            if (AE.TryGetCurrentPattern(TogglePattern.Pattern, out obj))

            {

                pt_dic[DPType.TOGGLE] = obj as TogglePattern;

            }

            if (AE.TryGetCurrentPattern(TransformPattern.Pattern, out obj))

            {

                pt_dic[DPType.TRANSFORM] = obj as TransformPattern;

            } 

            if (AE.TryGetCurrentPattern(ValuePattern.Pattern, out obj))

            {

                pt_dic[DPType.VALUE] = obj as ValuePattern;

            }

            if (AE.TryGetCurrentPattern(WindowPattern.Pattern, out obj))

            {

                pt_dic[DPType.WINDOW] = obj as WindowPattern;

            }

        }

    }

}

[소스] WrapAE.cs


관련 게시글

[소프트웨어 접근성] 포커스 소유 UI 요소 정보 수집기 만들기 1

[소프트웨어 접근성] 포커스 소유 UI 요소 정보 수집기 만들기 2

[소프트웨어 접근성] 포커스 소유 UI 요소 정보 수집기 만들기 4


프로젝트 파일

예제 7.2 포커스 소유 UI 요소 정보 수집기.zip

*개발 도구 환경 버전에 맞게 변환하세요.

반응형