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

[S/W 접근성] TreeWalker 메서드

언제나휴일 2016. 4. 19. 11:15
반응형

4.2 TreeWalker 메서드

 

 TreeWalker 클래스에서는 다양한 형태로 트리 구조에서 계층적으로 자동화 요소를 검색할 수 있는 메서드를 제공하고 있습니다.

 

메서드 명

설명

GetFirstChild

첫 번째 자식 요소를 검색

GetLastChild

마지막 자식 요소를 검색

GetNextSibling

다음 형제 요소를 검색

GetParent

부모 요소를 검색

GetPreviousSibling

이전 형제 요소를 검색

Normalize

조건에 가장 근접한 요소 검색(자신을 포함하여 상위 노드에서)

[ 4.1] TreeWalker 클래스의 검색 메서드

 

 만약 특정 자동화 요소를 포함하는 윈도우 자동화 요소를 검색한다면 TreeWalker의 부모 요소를 검색하는 GetParent 메서드를 호출하는 것을 반복하여 검색한 요소의 컨트롤 형식이 창인지 확인하면 되겠죠.

TreeWalker walker = TreeWalker.ControlViewWalker;

while (ae!= null)

{

    if (ae.Current.ControlType == ControlType.Window)

    {

        break;

    }

    ae = walker.GetParent(ae);                         

}

 

 

Program.cs


using System;

using System.Windows.Automation;

using System.Runtime.InteropServices;

 

namespace 요소를_포함하는_윈도우_검색

{

    class Program

    {

        static void Main(string[] args)

        {

            AutomationElement ae = AutomationElement.FromHandle(

                WrapApi.GetDesktopWindow());

            ListAE(ae, 0);

        }

 

        private static void ListAE(AutomationElement ae, int depth)

        {

            Condition cond1 = new PropertyCondition(

            AutomationElement.IsWindowPatternAvailableProperty, true);

            Condition cond2 = new PropertyCondition(

                    AutomationElement.IsEnabledProperty, true);

            TreeWalker tw = new TreeWalker(new AndCondition(cond1, cond2));

            ViewAE(ae, depth);

            AutomationElement cae = tw.GetFirstChild(ae);

            while (cae != null)

            {

                ListAE(cae, depth + 1);

                cae = tw.GetNextSibling(cae);

            }

        }

 

        private static void ViewAE(AutomationElement ae, int depth)

        {

            AutomationElement pae = FindWindow(ae);

            string pname = "없음";

            if (pae != null) {     pname = pae.Current.Name;      }

            Console.WriteLine("{0}:{1} 최상위:{2}", ae.Current.Name, depth, pname);

        }

 

        private static AutomationElement FindWindow(AutomationElement ae)

        {

            TreeWalker walker = TreeWalker.ControlViewWalker;

            while (ae!= null)

            {

                if (ae.Current.ControlType == ControlType.Window)

                {

                    break;

                }

                ae = walker.GetParent(ae);

            }

            return ae;

        }

    }

 

    static class WrapApi

    {

        [DllImport("user32")]

        internal static extern IntPtr GetDesktopWindow();

    }

}

[소스 4.3] 요소를 포함하는 윈도우 검색


요소를 포함하는 윈도우 검색


반응형