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

C++ 如何确定当前窗口是否为活动窗口?,c++,windows,winapi,mfc,C++,Windows,Winapi,Mfc,如何判断我的窗口是否为当前活动窗口? 我目前的猜测是执行GetForegroundWindow并将HWND与窗口的HWND进行比较。 还有比这更好的方法吗 我正在使用Win32 API/MFC。是的,这是我知道的唯一方法 但您必须处理GFW可以返回NULL的事实。通常,当另一个桌面(如屏幕保护程序桌面)处于活动状态时,会发生这种情况。请注意,使用保护密码可能会影响是否使用不同的桌面(这取决于windows版本,我记不起不同版本如何工作的详细信息) 此外,此代码在VisualStudio下的调试模

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


我正在使用Win32 API/MFC。

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

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

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


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

是的,除非您想检查每个线程的activewindow,否则您是正确的。

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

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


改用

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

case WM_ACTIVATEAPP:
     wActive = (bool)wParam;
return 0;
您可以转到查找有关WM\u ACTIVATEAPP的更多信息。是的,GetForgroundWindow()是一种很好的检查方法,即使在“始终在顶部”窗口(也称为HWND\u顶部)中也能正确运行

另一种方法是使用GetActiveWindow()

或者,如果焦点已更改,则以下消息会报告

    case WM_KILLFOCUS:
        // windowHasFocus = false
    break;

    case WM_SETFOCUS:
        // windowHasFocus = true;
    break;

这是错误的:“GetFocus返回具有当前线程消息队列的键盘焦点的窗口。[…]使用GetForeGroundIndow函数检索用户当前使用的窗口的句柄。”正如我所说:“如果您是指具有输入焦点的窗口”。GetFocus仅起作用“对于当前线程的消息队列”,这就是我的意思。GetForeGroundIndow是要调用的API,它的名称有误导性。该窗口可能不是z顺序中最顶端的窗口,但它返回具有全局焦点的窗口。即“是活动的”。我已经多年没有使用MSDN进行开发了,所以这个答案可能无效。
    case WM_KILLFOCUS:
        // windowHasFocus = false
    break;

    case WM_SETFOCUS:
        // windowHasFocus = true;
    break;