在Windows中,前景窗口和活动窗口有什么区别?具体而言,在什么情况下前景窗口可能不是活动窗口?如果这两个术语指的是同一个概念,为什么会有两个术语。MSDN文档在此处提到,“单击窗口”或使用“ALT+TAB”或“ALT+ESC”键组合使窗口同时处于活动状态和前景状态。没有明确说明两个术语之间的区别。请查看MSDN。
活动窗口(GetActiveWindow()
的结果)是附加到调用线程并接收输入的窗口。前景窗口(GetForegroundWindow()
的结果)是当前正在接收输入的窗口,而不管它与调用线程的关系如何。活动窗口基本上局限于您的应用程序;前景窗口是系统全局的。
例如,如果属于另一个进程的窗口是前景窗口,则从自己的进程中调用GetActiveWindow()
将返回NULL
。
我相信成为前景窗口意味着成为活动窗口,但反之则不成立。此外,请注意,在现代Windows中,应用程序通常不能使用 SetForegroundWindow()
从其他进程中夺取焦点(除非该进程已通过AllowSetForegroundWindow
明确授权)。
/----------------------\
| |
| FOREGROUND WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
/----------------------\
| |
| ACTIVE WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
来自MSDN
活动窗口
活动窗口是用户当前正在使用的应用程序的顶层窗口。系统把它放在z序列的顶部,更改其标题栏和边框的颜色为系统定义的活动窗口颜色,以便用户轻松识别活动窗口。只有顶层窗口可以成为活动窗口, 当用户正在使用一个子窗口时,系统会激活与子窗口相关的顶层父窗口。
前景/后景
每个进程都可以拥有多个执行线程,每个线程都可以创建窗口。创建与用户当前正在使用的窗口相对应的窗口的线程称为前景线程,该窗口称为前景窗口。所有其他线程都是后台线程, 由后台线程创建的窗口称为后台窗口。
GetActiveWindow
/SetActiveWindow
和GetForegroundWindow
/SetForegroundWindow
之间的区别,而不是关于最顶层或Z序。我很惊讶这个问题被接受了。 - jamesdlin
GetActiveWindow
并不一定会返回NULL
。后台线程的窗口可以被激活,而不必将其设置为前台窗口(例如通过未满足要求的SetForegroundWindow
调用或在启动应用程序和应用程序显示其UI之间切换到另一个应用程序)。关于活动窗口,你几乎是正确的:活动窗口是按线程(或输入附加线程组)虚拟化的,而不是按应用程序或进程。 - IInspectable