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

我怎么知道我的窗口是否是当前活动的窗口? 我目前的猜测是做GetForegroundWindow并比较HWND与我的窗口。 有没有比这更好的方法?

我正在使用Win32 API / MFC。

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

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

而且这个代码在Visual Studio的调试模式下不能正常工作,因为你会得到VS的窗口句柄。

除此之外,一切的桃子:-)

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

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

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

使用GetFocus()来代替。

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

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

你可以去MSDN查找更多关于WM_ACTIVATEAPP信息

是的,GetForgroundWindow()是一个很好的检查方法,即使在HWND_TOPMOST的“Always on top”窗口中也是正确的。

另一种方法是使用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;