背景中显示的窗口

本文关键字:窗口 显示 背景 | 更新日期: 2023-09-27 17:57:55

对于我的应用程序的一些用户,一些WPF窗口将显示在Shellwindow后面。这种情况只发生在某些地方。Shellwindow没有设置Topmost。我希望有人能给我一个提示,我能做些什么来防止这种情况发生。

谢谢。

致以最良好的问候,thomas

背景中显示的窗口

我只知道三种情况,其中一个窗口可能会失去焦点并消失在另一个应用程序的窗口后面:

  • 一个调用SetForegroundWindow()将其一个窗口推到前台的程序。自从~Win98以来,Windows就对此采取了具体的对策,这是一种经常发生的用户界面犯罪。只有当它在活动窗口中有一段时间没有检测到任何输入事件时,它才允许这样做。否则它将闪烁任务栏按钮。当然,程序员已经找到了应对措施。大约两年前,Windows Update的一个版本就开始这样做了。幸运的是,负责这件事的程序员被带到外面枪杀了。

  • 自我造成的那种,由短时间内没有的窗口能够接收焦点触发。Windows窗口管理器被迫找到另一个窗口来提供焦点。这很可能是一个"shell窗口",无论什么方便。最常见的情况是显示对话框并隐藏主窗口或自己禁用它。并在对话框关闭时再次显示。那太晚了,还有一小部分的时间没有窗口可以获得焦点。顺便说一句,它不会很好地重复,因为这取决于其他窗口可能可用。

  • 在线程上显示顶级非所有者窗口。这样的窗口不能与应用程序中的其他窗口有任何Z顺序关系,只能将桌面窗口作为父窗口。它与任何其他窗口竞争,包括Explorer拥有的窗口。在其他窗口上显示它是一种糟糕的做法,通常有效,但有时无效。当它是一个消息框时,对用户来说尤其痛苦。

您可以将辅助窗口的Window.Owner设置为主窗口,以避免子窗口出现在主窗口后面。我假设这就是你所说的shell窗口的意思。

以下是这样做的一些后果(来自文档):

  • 如果所有者窗口最小化,则其所有的窗口也将最小化
  • 如果最小化了所拥有的窗口,则不会最小化其所有者
  • 如果所有者窗口被最大化,则所有者窗口及其所有者窗口都将被恢复
  • 所有者窗口永远无法覆盖所有者窗口
  • 未使用ShowDialog打开的所属窗口不是模态窗口。用户仍然可以与所有者窗口进行交互
  • 如果关闭所有者窗口,其拥有的窗口也将关闭
  • 如果拥有的窗口是由其所有者窗口使用"显示"打开的,并且所有者窗口已关闭,则不会引发该拥有的窗口的"关闭"事件