5

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

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

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

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

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

4

2 回答 2

5

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

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

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

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

于 2010-05-11T14:11:58.737 回答
1

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

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

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

于 2010-05-12T11:36:15.263 回答