51

在 Windows 中,前台窗口和活动窗口有什么区别?具体来说,什么情况下前台窗口不能成为活动窗口?如果这 2 个术语指的是同一个概念,为什么会有 2 个术语。

此处的 msdn 文档提到“单击窗口,或使用ALT+TABALT+ESC组合键”使窗口和前景一样处于活动状态。这两个术语之间没有明确的区别。检查MSDN

4

2 回答 2

66

活动窗口( 的结果GetActiveWindow())是附加到获取输入的调用线程的窗口。前台窗口(的结果GetForegroundWindow())是当前正在获取输入的窗口,无论它与调用线程的关系如何。活动窗口本质上是针对您的应用程序进行本地化的;前台窗口对系统来说是全局的。

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

我相信作为前景窗口确实意味着作为活动窗口,但反之则不然。另请注意,在现代 Windows 中,应用程序通常不能用于SetForegroundWindow()从另一个进程中窃取焦点(除非该进程已通过 明确授予权限AllowSetForegroundWindow)。

于 2015-02-21T08:25:21.280 回答
13

我发现 MSDN 中的描述也有点混乱,但这是我修改后的结果:

首先,前台和后台窗口与活动窗口无关,它与线程有关,见下文。因此,从技术上讲,将背景窗口作为活动窗口是可行的,但是这很令人困惑,并且系统不会为您执行此操作,而是您的应用程序需要调用例如 SetWindowPos 以使背景窗口处于活动状态。

系统一次只能有一个活动的顶级窗口,如果您正在处理子窗口,系统将激活顶级窗口。然后所有输入都被定向到活动窗口,然后通常传递给子窗口。

/----------------------\
|                      |
|   FOREGROUND WINDOW  |--\
|                      |  |
\----------------------/  |
  | BACKGROUND WINDOW     |
  \-----------------------/

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

来自 MSDN

活动窗口

活动窗口是用户当前正在使用的应用程序的顶级窗口。为了让用户轻松识别活动窗口,系统将其放置在 z 顺序的顶部,并将其标题栏和边框的颜色更改为系统定义的活动窗口颜色。只有顶层窗口可以是活动窗口。当用户使用子窗口时,系统会激活与子窗口关联的顶级父窗口。

前景/背景

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

于 2010-10-15T07:48:33.780 回答