.NET/소프트웨어 접근성, UI 자동화

[S/W 접근성] TreeWalker로 요소름 포함하는 윈도우 탐색

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

TreeWalker로 요소름 포함하는 윈도우 탐색


응용 프로그램 설명

TreeWalker로 윈도우 탐색하여 콘솔 화면에 출력


응용 프로그램 유형

C# 콘솔 응용 프로그램


요구 조건

UI 자동화 .NET 어셈블리 참조(솔루션 탐색기에서 프로젝트 참조 노드의 오른쪽 마우스 클릭으로 컨텍스트 메뉴의 참조 추가 선택)




Program.cs

using System;

using System.Windows.Automation;

using System.Runtime.InteropServices;

 

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

{

    static class WrapApi

    {

        [DllImport("user32")]

        internal static extern IntPtr GetDesktopWindow();

    }

 

    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;

        }

    }

}


반응형