1

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

当我的应用程序被激活时,如何确定刚刚失去焦点的应用程序?有没有一种简单的方法可以做到这一点,或者我需要滚动一个特殊的 CBT 钩子吗?

4

1 回答 1

4

查看正在发送的消息及其参数的简单方法是启动 Spy++ 并将其设置为 Log Messages,同时 Alt+Tab 到另一个窗口。

与您所发现的一致,当先前活动的窗口(或处于活动状态的窗口)不在同一个线程中时lParam,两者都WM_SETFOCUSWM_ACTIVATE出现。NULL

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

如果您的应用程序不是一个小型实用程序,用户预计不会保持打开和运行很长时间,考虑到潜在的性能影响,如果可能的话,我会避免使用 CBT 挂钩。不幸的是,像这样跨流程边界的交互是困难的。

如果你不害怕使用可能会在未来版本的 Windows 中破坏的东西,你可以研究这个RegisterShellHookWindow函数。我不能告诉你太多关于它的信息,我自己从未使用过它,但它是一种更简单的方法来获取你只能通过安装钩子才能收到的 shell 消息。
它早在 Windows 2000 就已经存在,但直到 XP SP1 才包含在 SDK 中。据我所知,它仍然存在于 Windows Vista 和 7 中。

于 2011-03-03T09:23:51.683 回答