gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:11:26 27 4
gpt4 key购买 nike

我有这个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com