我可以在C#中使用窗口挂钩来确定窗口是获得焦点还是失去焦点?

我可以在C#中使用窗口挂钩来确定窗口是获得焦点还是失去焦点?,c#,automation,C#,Automation,我已经编写了一个c#应用程序,它可以自动化IE的一个实例。我想知道internet explorer何时获得焦点,何时失去焦点 从SHDocVw.InternetExplorer对象我可以得到它的HWND。从那里我如何创建一个消息钩子来接收WM_KILLFOCUS和WM_FOCUS事件(假设这些是要侦听的正确事件:) 谢谢大家 更新:我找到了一种不用钩子(我还没有完全弄清楚如何在c#中使用钩子)就能实现上述目标的方法,在本文中使用了.NET框架 此代码的问题 AutomationFocu

我已经编写了一个c#应用程序,它可以自动化IE的一个实例。我想知道internet explorer何时获得焦点,何时失去焦点

从SHDocVw.InternetExplorer对象我可以得到它的HWND。从那里我如何创建一个消息钩子来接收WM_KILLFOCUS和WM_FOCUS事件(假设这些是要侦听的正确事件:)

谢谢大家

更新:我找到了一种不用钩子(我还没有完全弄清楚如何在c#中使用钩子)就能实现上述目标的方法,在本文中使用了.NET框架

此代码的问题

    AutomationFocusChangedEventHandler focusHandler 
       = new AutomationFocusChangedEventHandler(OnFocusChanged);
    Automation.AddAutomationFocusChangedEventHandler(focusHandler);
一个窗口很容易成为前台窗口,当切换到该窗口时,该事件不会触发,因为它正在等待特定的UI元素处于焦点。(要测试这一点,您可以使用使用该代码的函数,并在每次新窗口处于焦点时打印消息,如MSDN示例TrackFocus,然后单击webbrowser。当浏览器中显示大多数网页或空白页时,只有选择地址栏或其他元素,事件才会触发。)如果有一种方法可以进行修改,以便在没有UI元素处于焦点或者每次元素失去焦点时(而不是在获得焦点时抛出)都可以抛出事件,那么它可能会工作。有人对我如何修复上面的代码来解决我的问题有什么想法吗


更新2:我也遇到了这个问题,这可能意味着我无法使用钩子来完成我想做的事情。

关于从C设置钩子的详细说明如下:

关于从C设置钩子的详细说明如下:

谢谢!我是否正确地假设,通过遵循这些说明并设置钩子,我将能够监听WM_KILLFOCUS和WM_FOCUS,以确定窗口何时处于焦点?好吧,我自己没有尝试过代码,但我在过去成功地实现了C#中的钩子。试试看,让我们知道进展如何。祝你好运好的,我已经阅读了您的示例,并且对钩子有了更好的理解——至少在我的应用程序中,事件钩住了windows。我需要做的是创建一个到另一个应用程序的钩子,这一点我仍然很困惑。要做到这一点,我可以将SetWindowsHookEx与另一个窗口的句柄和线程ID一起使用吗?我一直在搜索,我看到很多人说你需要创建一个单独的dll?谢谢对如果要在另一个进程的线程上安装钩子,钩子过程(即“侦听”钩子的函数)必须驻留在DLL中。它不需要是一个单独的DLL;它可以是作为应用程序一部分的DLL,只要它是可由目标应用程序加载和动态链接的DLL。看看这个:我把MouseHookProc函数放在一个dll中,并在我的项目中引用了这个dll(都在c#中)。我试图通过将句柄和线程id 0传递给IE来设置钩子(在我的主程序中,而不是dll中)。它仍然无法创建钩子。有什么想法吗?再次感谢你的帮助。谢谢!我是否正确地假设,通过遵循这些说明并设置钩子,我将能够监听WM_KILLFOCUS和WM_FOCUS,以确定窗口何时处于焦点?好吧,我自己没有尝试过代码,但我在过去成功地实现了C#中的钩子。试试看,让我们知道进展如何。祝你好运好的,我已经阅读了您的示例,并且对钩子有了更好的理解——至少在我的应用程序中,事件钩住了windows。我需要做的是创建一个到另一个应用程序的钩子,这一点我仍然很困惑。要做到这一点,我可以将SetWindowsHookEx与另一个窗口的句柄和线程ID一起使用吗?我一直在搜索,我看到很多人说你需要创建一个单独的dll?谢谢对如果要在另一个进程的线程上安装钩子,钩子过程(即“侦听”钩子的函数)必须驻留在DLL中。它不需要是一个单独的DLL;它可以是作为应用程序一部分的DLL,只要它是可由目标应用程序加载和动态链接的DLL。看看这个:我把MouseHookProc函数放在一个dll中,并在我的项目中引用了这个dll(都在c#中)。我试图通过将句柄和线程id 0传递给IE来设置钩子(在我的主程序中,而不是dll中)。它仍然无法创建钩子。有什么想法吗?再次感谢你的帮助。