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