C# Windows窗体中最顶层属性的真正讨厌的bug

C# Windows窗体中最顶层属性的真正讨厌的bug,c#,winforms,topmost,always-on-top,C#,Winforms,Topmost,Always On Top,我有一个Windows窗体应用程序,它位于通知区域。单击图标会将其带到前面,再次单击(或单击AppX图标)会将其返回。这是一种应用程序,当通过单击图标显示窗口时,窗口始终位于顶部非常重要(但这是可选的) 右键单击图标将显示一个上下文菜单,您可以选择是否启用“始终在顶部”选项。当应用程序第一次启动时,应用程序设置从XML文件中读取,我99%认为它正常工作,最上面的属性被正确读取(和写入) 一段时间后(分钟、小时、天,随便什么;我通常冬眠,很少关机),最上面的停止工作。我没有更改选项,我不认为有任何

我有一个Windows窗体应用程序,它位于通知区域。单击图标会将其带到前面,再次单击(或单击AppX图标)会将其返回。这是一种应用程序,当通过单击图标显示窗口时,窗口始终位于顶部非常重要(但这是可选的)

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

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

我不明白为什么会这样,怎么会这样。有人知道为什么吗?如果没有,你知道我如何调试这种行为吗

编辑:

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

有不止一个“TopMost”窗口。Topmost只是说“在所有非Topmost窗口之前”

我非常确定重新初始化桌面(例如休眠时)需要另一个
SetWindowPos(hwnd,hwnd\u topmest,…)
(这是底层的Win32 API调用)

作为一种解决方法,您可以在显示窗口时重置并再次设置属性


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

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

当你点击你的图标,你会显示你的窗口,并相信最上面的仍然是活跃的。为什么不在显示窗口之前使用当前设置调用
SetWindowPos()
。这不会产生任何性能问题(只有在用户单击图标时才会发生),也不会产生任何其他副作用


我知道,找出根本原因会很好,但如果你能用这样一个小的变通办法来解决它,可能就不值得了。

我知道我的应用程序不是唯一最顶级的窗口,但Windows Explorer、Firefox等都不是最顶级的,我的窗口应该是最顶级的。这不是因为这个小故障。我禁用并重新启用了这个选项,它会像应该的那样控制它们,我认为hibernate不是问题所在。我只是做了一个快速测试,在浏览器和Firefox打开的情况下休眠了机器。恢复后,我的应用程序仍然是最顶级的。它必须发生在不同的情况下…你尝试过我建议的解决方法吗?(显示窗口后,重置并设置“最上面的”属性)还没有,我正在尝试其他方法,看看问题是否出在现在注释掉的两行代码上。如果您找到原因/解决方案,请告诉我们。