前景与活动窗口

Posted

技术标签:

【中文标题】前景与活动窗口【英文标题】:Foreground Vs Active window 【发布时间】:2011-04-25 19:36:12 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

例如,如果属于另一个进程的窗口是前台,则在您自己的进程中调用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/SetActiveWindowGetForegroundWindow/SetForegroundWindow 之间的区别,而不是关于最高排序或 z 排序。我很惊讶这被接受了。

以上是关于前景与活动窗口的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 8 上设置前景窗口

如果内容与另一个属性值匹配,则更改标签前景

mspa怎样将热到区作为前景

Outlook Inspector Activate不会带来前景

windows判断窗口是否置顶设置取消置顶设置前景

会计学和金融学哪个就业前景更好,发展方向各是什么啊?