【发布时间】:2010-10-05 09:08:37
【问题描述】:
如何判断我的窗口是否是当前活动窗口? 我目前的猜测是做 GetForegroundWindow 并将 HWND 与我的窗口进行比较。 还有比这更好的方法吗?
我正在使用 Win32 API / MFC。
【问题讨论】:
如何判断我的窗口是否是当前活动窗口? 我目前的猜测是做 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)也能正常运行。
另一种方法是使用 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;
【讨论】: