c# - Windows 窗体中 TopMost 属性的真正烦人的错误

标签 c# winforms topmost always-on-top

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

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

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

我无法理解为什么会发生这种情况以及如何发生这种情况。有谁知道为什么?如果没有,知道我该如何尝试调试此类行为吗?

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

最佳答案

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

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

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

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

关于c# - Windows 窗体中 TopMost 属性的真正烦人的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777732/

相关文章:

powershell - 在 PowerShell 中将控制台设置为 Top-Most

c# - 如何使 WPF 窗口位于我的应用程序的所有其他窗口之上(不是系统范围的)?

c# - Mentalis 安全套接字库连接已关闭

c# - 如何在params中传递ref参数

c# - C#中的多个构造函数

c# - Show()、ShowDialog() 和 Application.Run() 函数之间有什么区别?

c# - 保存来自选择查询的值,然后在更新查询 SQL Server CE 中使用它们

c# - 听取使用 IEnumerable<T> 时用于 BlockingCollection 的 Queue.Peek() 的模拟

c# - 如何在棋局中实现移动?

c++ - 将窗口设置为最顶层