在背景中显示的窗口

时间:2011-05-30 19:41:34

标签: c# wpf view window

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

感谢。

最诚挚的问候,托马斯

2 个答案:

答案 0 :(得分:3)

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

  • 一个程序调用SetForegroundWindow()将其中一个窗口推入前台。自从Win98以来,Windows对此采取了特定的反措施,这是一种经常犯下的用户界面犯罪。如果它在活动窗口中没有检测到任何输入事件一段时间,它只允许这样做。否则它会闪烁任务栏按钮。当然,程序员已经找到了反制措施。大约两年前,一个版本的Windows Update开始执行此操作。幸运的是,负责这项工作的程序员被带到了外面拍摄。

  • 自我造成的类型,由于你的窗口的 none 能够接收焦点而短时间触发。 Windows窗口管理器被迫找到另一个窗口来提供焦点。这很可能是一个“贝壳窗口”,无论什么方便。在显示对话框并隐藏主窗口或自行禁用主窗口时,最常见。关闭对话框时再次显示它。现在为时已晚,只有一秒钟没有窗口可以获得焦点。它不会重复顺便,至少不是因为它取决于其他窗口可能是什么。

  • 在线程上显示顶级非拥有窗口。这样的窗口不能与应用程序中的其他窗口建立任何Z顺序关系,并且只有桌面窗口作为父窗口。它与任何其他窗口竞争的地方,包括Explorer拥有的窗口。将它显示在其他窗口的顶部是一个废话拍摄,通常可以工作,但有时不工作。当用户是消息框时,特别痛苦。

答案 1 :(得分:2)

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

以下是执行此操作的一些后果(来自文档):

  • 如果所有者窗口最小化,其所有拥有的窗口也会最小化。
  • 如果拥有的窗口最小化,则其所有者不会最小化。
  • 如果所有者窗口最大化,则还原所有者窗口及其拥有的窗口。
  • 所有者窗口永远不能涵盖拥有的窗口。
  • 使用ShowDialog未打开的自有窗口不是模态的。用户仍然可以与所有者窗口进行交互。
  • 如果您关闭所有者窗口,其拥有的窗口也会关闭。
  • 如果所有者窗口由其所有者窗口使用Show打开,并且所有者窗口关闭,则不会引发拥有窗口的Closing事件。