前景窗口与活动窗口

57
在Windows中,前景窗口和活动窗口有什么区别?具体而言,在什么情况下前景窗口可能不是活动窗口?如果这两个术语指的是同一个概念,为什么会有两个术语。MSDN文档在此处提到,“单击窗口”或使用“ALT+TAB”或“ALT+ESC”键组合使窗口同时处于活动状态和前景状态。没有明确说明两个术语之间的区别。请查看MSDN
2个回答

73

活动窗口(GetActiveWindow()的结果)是附加到调用线程并接收输入的窗口。前景窗口(GetForegroundWindow()的结果)是当前正在接收输入的窗口,而不管它与调用线程的关系如何。活动窗口基本上局限于您的应用程序;前景窗口是系统全局的。

例如,如果属于另一个进程的窗口是前景窗口,则从自己的进程中调用GetActiveWindow()将返回NULL

我相信成为前景窗口意味着成为活动窗口,但反之则不成立。此外,请注意,在现代Windows中,应用程序通常不能使用 SetForegroundWindow()从其他进程中夺取焦点(除非该进程已通过AllowSetForegroundWindow明确授权)。


4
这是正确的答案。另外阅读这篇博客文章也会很有用。 - Ruslan
1
严格来说,从后台线程调用GetActiveWindow并不一定会返回NULL。后台线程的窗口可以被激活,而不必将其设置为前台窗口(例如通过未满足要求的SetForegroundWindow调用或在启动应用程序和应用程序显示其UI之间切换到另一个应用程序)。关于活动窗口,你几乎是正确的:活动窗口是按线程(或输入附加线程组)虚拟化的,而不是按应用程序或进程。 - IInspectable
@Ruslan分享的博客文章Waybackmachine链接: https://web.archive.org/web/20150111083454/http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx 博客标题-“最后,没有什么是特别的了” - Sahil Singh
1
很烦人的是,MSDN将所有内容移动到新位置时没有设置重定向。当前位置为最终,没有什么特别的了 - jamesdlin

14
我也认为 MSDN 上的描述有点令人困惑,这是我的修订版本:
首先,前台和后台窗口与活动窗口无关,而与线程相关,请参见下文。因此,理论上可以将后台窗口作为活动窗口,但这会令人困惑,系统不会为您完成此操作,而是需要您的应用调用例如 SetWindowPos 使后台窗口成为活动窗口。
系统一次只能有一个活动顶级窗口,如果您正在使用子窗口,则系统将激活顶级窗口。所有输入都将定向到活动窗口,然后正常传递给子窗口。
/----------------------\
|                      |
|   FOREGROUND WINDOW  |--\
|                      |  |
\----------------------/  |
  | BACKGROUND WINDOW     |
  \-----------------------/

/----------------------\
|                      |
|    ACTIVE WINDOW     |--\
|                      |  |
\----------------------/  |
  | BACKGROUND WINDOW     |
  \-----------------------/

来自MSDN

活动窗口

活动窗口是用户当前正在使用的应用程序的顶层窗口。系统把它放在z序列的顶部,更改其标题栏和边框的颜色为系统定义的活动窗口颜色,以便用户轻松识别活动窗口。只有顶层窗口可以成为活动窗口, 当用户正在使用一个子窗口时,系统会激活与子窗口相关的顶层父窗口。

前景/后景

每个进程都可以拥有多个执行线程,每个线程都可以创建窗口。创建与用户当前正在使用的窗口相对应的窗口的线程称为前景线程,该窗口称为前景窗口。所有其他线程都是后台线程, 由后台线程创建的窗口称为后台窗口。


3
可以的。一个始终置顶窗口(带有WS_EX_TOPMOST属性)可以覆盖活动窗口(标题栏模糊,选择文本没有高亮,文本光标仍可用)。 - pinichi
@pinichi 我的理解是总在最上层并不重要。(如果你使用焦点跟随鼠标,你可以将键盘输入直接发送到一个不在最上层的窗口。) - jamesdlin
这个问题实际上是关于GetActiveWindow/SetActiveWindowGetForegroundWindow/SetForegroundWindow之间的区别,而不是关于最顶层或Z序。我很惊讶这个问题被接受了。 - jamesdlin
1
这些术语涉及内部进程与系统全局的区别,详见另一个答案雷蒙德·陈的博客文章,该文章链接在评论中提到了该答案。 - Cheers and hth. - Alf
1
很抱歉,这并没有太多意义。你回答的前半部分完全偏离了主题,而后半部分引用的 MSDN 文档也不准确。例如,系统并不会改变活动窗口标题栏的颜色。它只会对前台窗口进行操作(这恰好是前台线程的活动窗口)。总体来说,这个回答还有很大的提升空间,并不能真正解答问题。这不应该被认为是正确答案。 - IInspectable
显示剩余2条评论

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