C#:检测哪个应用程序具有焦点

C#:检测哪个应用程序具有焦点,c#,C#,我希望创建一个C#应用程序,根据当前关注的应用程序更改内容。因此,如果用户正在使用Firefox,我的应用程序就会知道这一点。同样适用于Chrome、Visual Studio、TweetDeck等 这可能吗?如果可能,我将如何实现它 我有一种感觉,我要求的太多了,但值得一试 非常感谢。Grrr。通常情况下,在发布这个问题之前,我花了一些时间在谷歌上搜索 一旦我最终发布了这个问题,我的下一次谷歌搜索显示了答案 我还没有对它进行测试,但它似乎是关键 这里是一个链接,指向提供信息的页面,而不是我重写

我希望创建一个C#应用程序,根据当前关注的应用程序更改内容。因此,如果用户正在使用Firefox,我的应用程序就会知道这一点。同样适用于Chrome、Visual Studio、TweetDeck等

这可能吗?如果可能,我将如何实现它

我有一种感觉,我要求的太多了,但值得一试


非常感谢。

Grrr。通常情况下,在发布这个问题之前,我花了一些时间在谷歌上搜索

一旦我最终发布了这个问题,我的下一次谷歌搜索显示了答案

我还没有对它进行测试,但它似乎是关键

这里是一个链接,指向提供信息的页面,而不是我重写已经编写的内容:


为任何人的时间道歉我浪费在问一个谷歌(?)答案上。

看看,看看WM\u ACTIVATEAPP消息,它会告诉你什么时候应用被激活,即接收焦点。

这可以在纯.NET中使用WPF的一部分来完成。添加对
UIAutomationClient
UIAutomationTypes
的引用并使用,例如:


AddMessageFilter的优点是它是纯托管代码,GetForeGroundIndows不太“重”(需要时检查前台窗口,而不是每次应用程序更改都收到通知),但需要PInvoke。您现在只需选择;)使用可访问性界面。这正是他们所要做的。这个问题的公认答案是根据@RaymondChen的评论展开的:
应用程序。AddMessageFilter
只截取当前进程的消息,而不截取其他进程的消息。
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);
            }
        }
    }
}