21

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?

I have a feeling I'm asking for to much - but it's worth a try.

Many thanks in advance.

greggannicott
  • 885
  • 2
  • 9
  • 22
  • Use the accessibility interfaces. This is exactly the sort of thing they are for. – Raymond Chen Feb 08 '12 at 11:18
  • The accepted answer to this question expands upon @RaymondChen's comment: http://stackoverflow.com/questions/11711400/how-to-monitor-focus-changes – John Feb 19 '14 at 17:15

3 Answers3

13

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);
            }
        }
    }
}
larsmoa
  • 12,604
  • 8
  • 62
  • 85
6

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.

greggannicott
  • 885
  • 2
  • 9
  • 22
  • 1
    AddMessageFilter has the advantage to be purely managed code, GetForegroundWindows is less "heavy" (you check the foreground windows when you need, instead of being notified for every application change) but needs PInvoke. You have only to choose now ;) – munissor Feb 02 '10 at 11:31
  • Link rot is a thing. – Olorin Sep 01 '23 at 14:24
5

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.

Håvard S
  • 23,244
  • 8
  • 61
  • 72
  • 8
    `Application.AddMessageFilter` only intercepts messages for the current process, not other processes. – larsmoa Sep 16 '14 at 19:07