【问题标题】:WM_SETFOCUS, get app that just lost focusWM_SETFOCUS,获取刚刚失去焦点的应用
【发布时间】:2011-07-07 21:38:52
【问题描述】:

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

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

【问题讨论】:

    标签: c++ windows winapi wtl


    【解决方案1】:

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

    与您发现的一致,当先前活动的窗口(或活动的窗口)不在同一个线程中时,WM_SETFOCUSWM_ACTIVATElParam 将是 NULL

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

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

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

    【讨论】:

    • +1 我忘了RegisterShellHookWindow!我在我的应用程序中使用它来检测我的应用程序的 .chm 帮助文件何时关闭,以便我可以记住它的大小和位置,并在它再次启动时恢复它。红色警告文本令人担忧,但它似乎在 XP 到 7 上都可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多