WM_SETFOCUS,获得刚失去焦点的应用程序

时间:2011-03-03 08:53:34

标签: c++ windows winapi wtl

当我的WTL C ++应用程序被激活或获得键盘焦点时,我需要确定之前已激活/具有焦点的应用程序的窗口句柄。但是,WM_SETFOCUSWM_ACTIVATE消息的窗口句柄(LPARAM)都是NULL(XP,32位)。

如何在激活应用程序时确定刚丢失焦点的应用程序?有没有一种简单的方法可以做到这一点,还是需要滚动一个特殊的CBT钩?

1 个答案:

答案 0 :(得分:4)

一种简单的方法可以确切地查看正在发送的消息及其参数是什么,以便在您将Alt + Tab添加到另一个窗口时启动Spy ++并将其设置为Log Messages。

与您发现的内容一致,lParamWM_SETFOCUS的{​​{1}}在以前处于活动状态的窗口(或正在激活的窗口)时为WM_ACTIVATE不在同一个帖子里。

正如大卫建议的那样,WM_ACTIVATEAPP可能会有更多的运气。获得线程标识符后,可以尝试调用GetGUIThreadInfo function来确定该线程的活动窗口。即使活动窗口不属于调用进程,此函数也将起作用。

如果您的应用程序不是一个小型实用程序,而用户不希望长时间保持打开和运行,那么考虑到可能的性能影响,我会尽量避免使用CBT挂钩。不幸的是,跨过程边界的这种交互很困难。

如果您不担心可能会破坏未来版本的Windows,可以调查RegisterShellHookWindow function。我不能告诉你太多关于它的事情,我自己从未使用它,但这是一种更容易获得shell信息的方法,否则只能通过安装钩子来获得。 它可以追溯到Windows 2000,但直到XP SP1才包含在SDK中。据我所知,它仍然存在于Windows Vista和7中。