我怎么知道我的窗口是否是当前活动的窗口? 我目前的猜测是做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;