我在通知区域中有此Windows Forms应用程序。单击该图标将其显示在前面,再次单击它(或单击应用程序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/

10-11 01:01