在Windows中,前景窗口和活动窗口有什么区别?具体而言,前景窗口在什么情况下不能成为活动窗口?如果2个术语指的是相同的概念,为什么有2个术语。
这里的msdn文档提到“单击一个窗口,或者使用 ALT + TAB 或 ALT + ESC 组合键“使窗口处于活动状态以及前景。没有明确说明两个术语之间的区别。检查MSDN。
答案 0 :(得分:52)
活动窗口(GetActiveWindow()
的结果)是附加到调用线程的窗口,用于获取输入。前景窗口(GetForegroundWindow()
的结果)是当前获得输入的窗口,无论其与调用线程的关系如何。活动窗口基本上是本地化的应用程序;前台窗口是系统的全局窗口。
例如,如果属于另一个进程的窗口是前台,则在您自己的进程中调用GetActiveWindow()
将返回NULL
。
我认为前景窗口意味着成为活动窗口是正确的,但反过来却不是这样。另请注意,在现代Windows中,应用程序通常无法使用SetForegroundWindow()
从另一个进程窃取焦点(除非该进程已通过AllowSetForegroundWindow
明确授予权限。)
答案 1 :(得分:10)
我发现MSDN中的描述有点令人困惑,但这是我修改过的内容:
首先,前景和后台窗口与活动窗口无关,它与线程有关,见下文。因此,技术上可以将后台窗口作为活动窗口,但它很混乱,系统不会为您执行此操作,而是您的应用需要调用,例如SetWindowPos使背景窗口处于活动状态。
系统一次只能有一个活动的顶级窗口,如果您正在使用子窗口,系统将激活顶级窗口。然后将所有输入定向到活动窗口,然后通常传递给子窗口。
/----------------------\
| |
| FOREGROUND WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
/----------------------\
| |
| ACTIVE WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
来自MSDN
活动窗口
活动窗口是用户当前正在使用的应用程序的顶级窗口。为了使用户能够轻松识别活动窗口,系统将其置于z顺序的顶部,并将其标题栏和边框的颜色更改为系统定义的活动窗口颜色。只有顶级窗口才能成为活动窗口。当用户使用子窗口时,系统会激活与子窗口关联的顶级父窗口。
前景/背景的
每个进程可以有多个执行线程,每个线程都可以创建窗口。创建用户当前工作的窗口的线程称为前台线程,窗口称为前台窗口。所有其他线程都是后台线程,后台线程创建的窗口称为后台窗口。