greggannicott
greggannicott

Reputation: 883

C#: Detecting which application has focus

I'm looking to create a C# application that changes content according to which application currently has focus. So if the user is using Firefox, my app would know that. Same for Chrome, Visual Studio, TweetDeck etc.

Is this possible, and if so - how would I go about achieving it?

Upvotes: 21

Views: 18618

Answers (3)

larsmoa
larsmoa

Reputation: 12942

This can be done in pure .NET using the Automation framework that is part of the WPF. Add references to UIAutomationClient and UIAutomationTypes and use Automation.AddAutomationFocusChangedEventHandler, e.g.:

public class FocusMonitor
{
    public FocusMonitor()
    {
        AutomationFocusChangedEventHandler focusHandler = OnFocusChanged;
        Automation.AddAutomationFocusChangedEventHandler(focusHandler);
    }

    private void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e)
    {
        AutomationElement focusedElement = sender as AutomationElement;
        if (focusedElement != null)
        {
            int processId = focusedElement.Current.ProcessId;
            using (Process process = Process.GetProcessById(processId))
            {
                Debug.WriteLine(process.ProcessName);
            }
        }
    }
}

Upvotes: 13

Håvard S
Håvard S

Reputation: 23886

Take a look at Application.AddMessageFilter, and look for WM_ACTIVATEAPP messages, which will tell you when an app is activated, i.e. receives focus.

Upvotes: 5

greggannicott
greggannicott

Reputation: 883

Grrr. As is often the way, I spent some time Googling before posting this question.

Once I finally posted the question, my next Google search revealed the answer.

I've yet to test it, but it looks as though GetForegroundWindow() is the key.

Rather than me rewrite what's already written, here's a link to the page that provided the information:

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

Appologies for anyone's time I've wasted by asking a Googalable (?) answer.

Upvotes: 5

Related Questions