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

10

如何判断我的窗口是否是当前活动窗口? 我的猜测是使用 GetForegroundWindow 并将其返回的 HWND 与我的窗口进行比较。 除此之外,还有更好的方法吗?

我正在使用 Win32 API / MFC。

5个回答

11

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

但你必须处理GFW可能会返回空值的情况。通常情况下,这种情况发生在另一个桌面(例如屏幕保护程序桌面)处于活动状态时。注意使用屏幕保护密码可能会影响是否使用不同的桌面(这取决于Windows版本,我记不清楚各个版本的细节了)。

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

除此以外,一切都很棒 :-)


3
您可以尝试使用WM_ACTIVATEAPP消息。
首先定义一个布尔变量bool wActive = false, 在WndProc过程中,下面是接下来的代码片段:
case WM_ACTIVATEAPP:
     wActive = (bool)wParam;
return 0;

你可以去MSDN网站获取关于WM_ACTIVATEAPP的更多信息。

我已经多年没有使用MSDN相关的开发了,所以这个答案可能已经失效。 - towry

1

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


1

我猜你所说的“活动窗口”是指当前拥有输入焦点的窗口?

如果是这样,那么忘记GetForegroundWindow() API吧。它会返回最顶层的窗口,而不一定是当前拥有输入焦点的窗口。

可以使用GetFocus()代替。


这是错误的:“GetFocus 返回当前线程消息队列中具有键盘焦点的窗口。[...] 使用 GetForegroundWindow 函数检索用户当前正在使用的窗口的句柄。” - Martin Plante
就像我所说的:“如果你指的是当前拥有输入焦点的窗口。” - Stefan
1
GetFocus仅适用于“当前线程的消息队列”,这就是我的意思。 GetForegroundWindow是要调用的API,而名称是具有误导性的。该窗口可能不是z顺序中最顶部的窗口,但它返回具有全局焦点的窗口。即“处于活动状态”。 - Martin Plante

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接