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?
I have a feeling I'm asking for to much - but it's worth a try.
Many thanks in advance.
Solution 1:
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);
}
}
}
}
Solution 2:
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.
Solution 3:
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.