본문 바로가기
프로그래밍 언어/WPF

[C#] WPF - 특정 프로세스 Focus 여부 판단 방법

by Jinwood 2023. 1. 9.
반응형

이 글은 VisualStudio 환경에서 WPF 개발 시 MainWindow 코드에서

특정 프로그램이 Focus 되었을 때 어떤 동작(MainWindow 색상 조절과 등)을 수행해야하는 경우,

Win32 dll을 Import하지 않고 기본으로 제공되는 EventHandler를 사용하는 방법에 대한 설명이다.

 

첫 번째 : UIAutomationClient 참조 추가.

VisualStudio(이 글에서 사용하는 버전은 VS2015) 에서 참조 → 참조 추가를 클릭한다.

어셈블리 → 프레임워크 → UIAutomationClient 포함한 4개항목 선택 → 확인 버튼을 클릭하여 참조 추가를 진행한다.

 

이후 아래 네임스페이스를 참조 추가해준다.

Diagnostics는 Process ID 비교를 위해 사용되고, Automation은 위에 서술된 Event Handler를 정의하기 위해 사용된다.

1. System.Diagnostics

2. System.Windows.Automation;

두 번째 : MainWindow에서 Automation.AddAutomationFocusChangedEventHandler 추가

전체 코드는 아래와 같다.

System.Windows.Automation.Automation.AddAutomationFocusChangedEventHandler("이벤트 이름")

 

아래 코드는 MainWindow() 생성자에 Automation.AddAutomationFocusChangedEventHandler(FocusChangedHandler) 를 선언해주고, 아래애 FocusChangedHandler() 메서드를 작성한 것이다.

 

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        
        // 이벤트 핸들러 추가
        System.Windows.Automation.Automation.AddAutomationFocusChangedEventHandler(FocusChangedHandler);
    }
    
    int _processId = -1;
    private void FocusChangedHandler(object sender, AutomationFocusChangedEventArgs e)
    {
        try
        {
            AutomationElement element = sender as AutomationElement;
            if (element != null)
            {
                string name = element.Current.Name; //현재 Focus된 요소의 이름
                string id = element.Current.AutomationId; //현재 Focus된 요소의 Id(string)
                int processId = element.Current.ProcessId; //현재 Focus된 요소의 Process Id
                using (Process process = Process.GetProcessById(processId))
                {
                    if (process.Id == _processId) //프로세스 Id가 _processId와 일치할 경우 투명도 조절
                    {
                        Dispatcher.Invoke(() => this.Opacity = 1.0);
                    }
                    else
                    {
                        Dispatcher.Invoke(() => this.Opacity = 0.9);
                    }
                }
            }
        }
        catch
        {

        }
    }
}
반응형

댓글