如何确定当前窗口是否为活动窗口?

时间:2009-02-04 10:50:20

标签: c++ windows winapi mfc

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

我正在使用Win32 API / MFC。

5 个答案:

答案 0 :(得分:11)

是的,这是我所知道的唯一方式。

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

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

除此之外一切都是桃子: - )

答案 1 :(得分:1)

是的,你是正确的,除非你想要检查每个线程的活动窗口。

答案 2 :(得分:1)

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

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

请改用GetFocus()

答案 3 :(得分:1)

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

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

您可以转到MSDN查找有关WM_ACTIVATEAPP

的更多信息

答案 4 :(得分:0)

是的,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;