【问题标题】:Really annoying bug with TopMost property in Windows FormsWindows 窗体中 TopMost 属性的真正烦人的错误
【发布时间】:2011-02-16 04:34:01
【问题描述】:

我有这个 Windows 窗体应用程序,它位于通知区域中。单击图标将其置于前面,再次单击它(或单击应用程序 X 图标)将其返回。这种类型的应用程序在通过单击图标显示窗口时始终位于顶部很重要(尽管它是可选的)。

右键单击该图标会弹出一个上下文菜单,您可以在其中选择是否启用“始终位于顶部”选项。当应用程序第一次启动时,应用程序设置是从一个 XML 文件中读取的,我 99% 认为这是正常工作的,TopMost 属性被正确读取(和写入)。

一段时间后(几分钟、几小时、几天等等;我通常会休眠,很少关机)TopMost停止工作。我没有更改选项,我认为没有任何东西会更改选项值,但是我单击通知区域图标并且应用程序没有被提前显示。它出现了,但它在背景上(它显示在 Alt+Tab 上),它不是“总是在最上面”,因为它应该。我打开上下文菜单,禁用该选项(因为它已启用)并重新启用它,然后它开始工作。该应用程序现在“始终处于领先地位”。但是,它可能会在一段时间后随时失去此能力。

我不明白为什么会发生这种情况以及如何发生这种情况。有谁知道为什么?如果没有,知道如何尝试调试这种行为吗?

编辑:
当TopMost 属性被更改时,我添加了一段代码来显示一个MessageBox,看看我是否能注意到任何奇怪的行为,但这并不好。它没有帮助,因为表单是TopMost = true,但它仍然在后台......

【问题讨论】:

    标签: c# winforms topmost always-on-top


    【解决方案1】:

    有不止一个“最顶层”窗口。最顶层只是说“在所有非最顶层窗口之前”。

    我很确定重新初始化桌面(例如休眠时)需要另一个 SetWindowPos(hwnd, HWND_TOPMOST, ...)(这是底层 Win32 API 调用)。

    作为一种解决方法,您可以在显示窗口时重新设置和设置属性。

    另一种可能性是隐藏窗口也会改变 Z 顺序 - 无论是隐含的 Win32 如何实现它,还是显式地以 WinForms 调用隐藏/显示窗口的方式。

    【讨论】:

    • 我知道我的应用程序不是唯一的最顶层窗口,但 Windows Explorer、Firefox 等不是最顶层的,我的窗口应该在这些窗口之上。由于这个故障,这没有发生。我禁用并重新启用该选项,它应该会在它们之上。
    • 我不认为休眠是问题所在。我刚刚做了一个快速测试,并在打开资源管理器和 Firefox 的情况下使机器休眠。恢复后,我的应用程序仍然是最上面的。它必须发生在不同的情况下......
    • 您尝试过我建议的解决方法吗? (显示窗口后,重置并设置“topmost”属性)
    • 还没有,我先试试别的,看看问题出在现在被注释掉的两行代码上。
    • 如果您找到原因/解决方案,请告诉我们。
    【解决方案2】:

    像 peterchen 一样,我也不知道如何找到根本原因。但是为什么不让它简单一点呢?

    当您单击您的图标时,您将显示您的窗口并相信 TopMost 仍然处于活动状态。为什么不在显示窗口之前使用当前设置调用SetWindowPos()。这不会造成任何性能问题(仅当用户单击图标时才会发生)或任何其他副作用。

    我知道,找出根本原因会很好,但如果你能用这么小的解决方法解决它,可能就不值得了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      相关资源
      最近更新 更多