2) 실습: 활성화 상태의 버튼 조사기

이제 FindAll 메서드를 사용하는 간단한 콘솔 응용 프로그램을 만들어 봅시다. 이번에 만들 콘솔 응용 프로그램은 활성화 상태의 모든 버튼을 조사하는 기능을 수행할 것입니다.

 

활성화 버튼 조사 실행 화면
활성화 버튼 조사 실행 화면

이 프로그램에서는 UI 자동화 기술을 사용합니다. 이를 위해 프로젝트에 필요한 어셈블리를 참조하세요. 앞으로 작성하는 모든 프로그램은 위의 4가지 어셈블리를 참조합니다.

UIAutomationClient.dll

UIAutomationClientsideProviders.dll

UIAutomationTypes.dll

WindowBase.dll

static void Main(string[] args)
{
 먼저 AutomationElement의 정적 속성인 RootElement를 참조합니다.
    AutomationElement ae = AutomationElement.RootElement;
 컨트롤 형식이 버튼을 찾기 위한 컨디션 개체를 생성합니다.
    Condition con_but = new PropertyCondition(AutomationElement.ControlTypeProperty,
          ControlType.Button);
 사용 가능한 상태를 찾기 위한 컨디션 개체를 생성합니다.
    Condition con_en = new PropertyCondition(AutomationElement.IsEnabledProperty, true);
 생성한 두 개의 컨디션 개체로 AndConditon 개체를 생성합니다.
    Condition con_and = new AndCondition(con_but,con_en);
 FindAll 메서드를 이용하여 서브 트리의 원하는 조건의 자동화 요소를 탐색합니다.
    AutomationElementCollection aec= ae.FindAll(TreeScope.Subtree, con_and);
 탐색한 요소들의 정보를 출력합니다.
    foreach (AutomationElement sae in aec){    ViewAEInfo(sae);    }
}

private static void ViewAEInfo(AutomationElement ae)
{
 여기에서는 요소 이름과 윈도우 핸들, 프로세스 ID를 출력합시다.
   Console.Write("요소명:{0} ", ae.Current.Name);
   Console.Write("  윈도우 창 핸들:{0}", ae.Current.NativeWindowHandle);
   Console.WriteLine("  프로세스 ID:{0}", ae.Current.ProcessId);
}
using System;
using System.Windows.Automation;

namespace 버튼_컨트롤_조사하기
{
    class Program
    {
        static void Main(string[] args)
        {
            AutomationElement ae = AutomationElement.RootElement;
            
            Condition con_but = new PropertyCondition(
                 AutomationElement.ControlTypeProperty, ControlType.Button);
            Condition con_en = new PropertyCondition(
                 AutomationElement.IsEnabledProperty, true);
            Condition con_and = new AndCondition(con_but,con_en);

            AutomationElementCollection aec= ae.FindAll(TreeScope.Subtree, con_and);
            foreach (AutomationElement sae in aec)
            {
                ViewAEInfo(sae);
            }
        }        
        private static void ViewAEInfo(AutomationElement ae)
        {
            Console.Write("요소명:{0} ", ae.Current.Name);            
            Console.Write("  윈도우 창 핸들:{0}", ae.Current.NativeWindowHandle);
            Console.WriteLine("  프로세스 ID:{0}", ae.Current.ProcessId);
        }
    }
}

[소스 3.2] Program.cs