【问题标题】:How to determine if the current window is the active window?如何判断当前窗口是否为活动窗口?
【发布时间】:2010-10-05 09:08:37
【问题描述】:

如何判断我的窗口是否是当前活动窗口? 我目前的猜测是做 GetForegroundWindow 并将 HWND 与我的窗口进行比较。 还有比这更好的方法吗?

我正在使用 Win32 API / MFC。

【问题讨论】:

    标签: c++ windows winapi mfc


    【解决方案1】:

    是的,这是我知道的唯一方法。

    但是您必须处理 GFW 可以返回 NULL 的事实。通常,当另一个桌面(例如屏幕保护程序桌面)处于活动状态时会发生这种情况。请注意,使用保护程序密码会影响是否使用不同的桌面(这取决于 Windows 版本,我不记得不同版本如何工作的详细信息)。

    此外,这段代码在 Visual Studio 下的调试模式下也无法正常工作,因为您将获得 VS 的窗口句柄。

    除此之外,一切都很美好:-)

    【讨论】:

      【解决方案2】:

      是的,除非您想检查每个线程的活动窗口,否则您是正确的。

      【讨论】:

        【解决方案3】:

        当您说“活动窗口”时,我假设您的意思是具有输入焦点的窗口?

        在这种情况下,忘记 GetForegroundWindow() API。这将返回最顶层的窗口 - 并不总是具有输入焦点的窗口。

        请改用GetFocus()

        【讨论】:

        • 这是错误的:“GetFocus 返回当前线程消息队列的具有键盘焦点的窗口。[...] 使用 GetForegroundWindow 函数检索用户当前所在窗口的句柄工作。”
        • 正如我所说:“如果您的意思是具有输入焦点的窗口”。
        • GetFocus 仅适用于“当前线程的消息队列”,这就是我的意思。 GetForegroundWindow 是要调用的 API,名称具有误导性。该窗口可能不是 z 顺序中的最顶层,但它返回具有全局焦点的窗口。即“处于活动状态”。
        【解决方案4】:

        您可以尝试使用 WM_ACTIVATEAPP 消息。
        首先定义一个bool变量bool wActive = false,在WndProc过程中,这里是下一段代码:

        case WM_ACTIVATEAPP:
             wActive = (bool)wParam;
        return 0;
        

        您可以前往MSDN了解更多关于WM_ACTIVATEAPP的信息

        【讨论】:

        • 我多年来一直没有使用 MSDN 的东西进行开发,所以这个答案可能无效。
        【解决方案5】:

        是的,GetForgroundWindow() 是一种很好的检查方法,即使使用“始终位于顶部”窗口(即 HWND_TOPMOST)也能正常运行。

        另一种方法是使用 GetActiveWindow()

            HWND temp = GetActiveWindow();
            if (temp == hWnd) // Then your current window has focus
        

        或者,如果焦点发生变化,以下消息会报告

            case WM_KILLFOCUS:
                // windowHasFocus = false
            break;
        
            case WM_SETFOCUS:
                // windowHasFocus = true;
            break;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-13
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多