Foreground Vs活动窗口

时间:2010-10-15 07:41:26

标签: winapi window foreground

在Windows中,前景窗口和活动窗口有什么区别?具体而言,前景窗口在什么情况下不能成为活动窗口?如果2个术语指的是相同的概念,为什么有2个术语。

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

2 个答案:

答案 0 :(得分:52)

活动窗口(GetActiveWindow()的结果)是附加到调用线程的窗口,用于获取输入。前景窗口(GetForegroundWindow()的结果)是当前获得输入的窗口,无论其与调用线程的关系如何。活动窗口基本上是本地化的应用程序;前台窗口是系统的全局窗口。

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

我认为前景窗口意味着成为活动窗口是正确的,但反过来却不是这样。另请注意,在现代Windows中,应用程序通常无法使用SetForegroundWindow()从另一个进程窃取焦点(除非该进程已通过AllowSetForegroundWindow明确授予权限。)

答案 1 :(得分:10)

我发现MSDN中的描述有点令人困惑,但这是我修改过的内容:

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

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

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

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

来自MSDN

活动窗口

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

前景/背景

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