前景与活动窗口
Posted
技术标签:
【中文标题】前景与活动窗口【英文标题】:Foreground Vs Active window 【发布时间】:2011-04-25 19:36:12 【问题描述】:在 Windows 中,前台窗口和活动窗口有什么区别?具体来说,什么情况下前台窗口不能成为活动窗口?如果这 2 个术语指的是同一个概念,为什么会有 2 个术语。
此处的 msdn 文档提到“单击窗口,或使用 ALT+TAB 或 ALT+ESC kbd> 组合键”使窗口和前景一样活跃。这两个术语之间没有明确的区别。检查MSDN。
【问题讨论】:
【参考方案1】:活动窗口(@987654324@ 的结果)是附加到获取输入的调用线程 的窗口。前台窗口(@987654325@ 的结果)是当前正在获取输入的窗口,无论它与调用线程的关系如何。活动窗口本质上是针对您的应用程序进行本地化的;前台窗口对系统来说是全局的。
例如,如果属于另一个进程的窗口是前台,则在您自己的进程中调用GetActiveWindow()
将返回NULL
。
我相信作为前景窗口意味着作为活动窗口是正确的,但反之则不然。另请注意,在现代 Windows 中,应用程序通常不能使用 SetForegroundWindow()
从另一个进程中窃取焦点(除非该进程已通过 AllowSetForegroundWindow
明确授予权限)。
【讨论】:
这是正确答案。 this blog post 也值得阅读。 严格来说,从后台线程调用GetActiveWindow
会返回NULL
。可以激活后台线程的窗口,而无需将其设为前台窗口(例如,通过调用 SetForegroundWindow
而不满足要求,或者如果您在启动应用程序和显示其 UI 的应用程序之间切换到另一个应用程序)。不过,您对活动窗口的看法几乎是正确的:活动窗口是按线程(或输入附加线程组)虚拟化的,而不是按应用程序或进程虚拟化的。
@Ruslan web.archive.org/web/20150111083454/http://blogs.msdn.com/b/… 分享的博客文章的 Waybackmachine 链接 博客标题 - “最终,没有什么特别的了”
令人烦恼的是,MSDN 移动了所有内容而没有设置重定向到新位置。当前位置是Eventually, nothing is special any more。【参考方案2】:
我发现 MSDN 中的描述也有点混乱,但这是我修改后的看法:
首先,前台和后台窗口与活动窗口无关,它与线程有关,见下文。因此,从技术上讲,将背景窗口作为活动窗口是可行的,但这很令人困惑,并且系统不会为您执行此操作,而是您的应用程序需要调用例如SetWindowPos 使背景窗口处于活动状态。
系统一次只能有一个活动的***窗口,如果您正在处理子窗口,系统将激活***窗口。然后所有输入都被定向到活动窗口,然后通常传递给子窗口。
/----------------------\
| |
| FOREGROUND WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
/----------------------\
| |
| ACTIVE WINDOW |--\
| | |
\----------------------/ |
| BACKGROUND WINDOW |
\-----------------------/
来自 MSDN
活动窗口
活动窗口是用户当前正在使用的应用程序的***窗口。为了让用户轻松识别活动窗口,系统将其放置在 z 顺序的顶部,并将其标题栏和边框的颜色更改为系统定义的活动窗口颜色。只有顶层窗口可以是活动窗口。当用户使用子窗口时,系统会激活与子窗口关联的***父窗口。
前景/背景
每个进程可以有多个执行线程,每个线程可以创建窗口。创建用户当前正在使用的窗口的线程称为前台线程,窗口称为前台窗口。其他所有线程都是后台线程,后台线程创建的窗口称为后台窗口。
【讨论】:
微软表示,前台窗口(属于前台线程)具有更高的优先级。在您的第三种情况下,ACTIVE WINDOW 是否获得了相同的特权? msdn 对活动窗口的描述: 活动窗口是用户当前正在使用的应用程序的顶层窗口。为了让用户轻松识别活动窗口,系统将其放置在 z 顺序的顶部,并将其标题栏和边框的颜色更改为系统定义的活动窗口颜色。只有顶层窗口可以是活动窗口。当用户使用子窗口时,系统会激活与子窗口关联的***父窗口。 那么上面给出的第三种情况是否可能? 是的,这是可能的。始终位于顶部的窗口(具有 WS_EX_TOPMOST)可以与活动窗口重叠(标题栏模糊,选择文本不高,文本光标......虽然) @pinichi AFAICT 始终处于领先地位并不重要。 (如果您使用焦点跟随鼠标,您也可以将键盘输入定向到不在顶部的窗口。) 这个问题实际上是关于GetActiveWindow
/SetActiveWindow
和 GetForegroundWindow
/SetForegroundWindow
之间的区别,而不是关于最高排序或 z 排序。我很惊讶这被接受了。以上是关于前景与活动窗口的主要内容,如果未能解决你的问题,请参考以下文章