0

我正在为正在迁移到 Windows 7 的学校开发一个简单的活动桌面替代品。这个想法是创建一个带有几个带有图片的大按钮的窗口,以便阅读困难的幼儿可以使用它们。

我正在使用 SetParent() 将窗口的父级设置为“Progman”,以便它始终位于后面,并且在用户选择“显示桌面”时不会最小化。在 Windows XP 上一切正常,但在 Windows 7 上,当用户单击“显示桌面”时,窗口仍然存在,但内容被用户 Windows 背景替换。这些按钮仍然有效(您只是看不到它们),如果您调整窗口大小或以其他方式更新窗口,它们会再次出现。问题图片:
https://files.me.com/adt100/ggi99t

任何想法为什么会发生这种情况?有谁知道按下“显示桌面”时我可以强制刷新窗口的方法?

4

1 回答 1

2

我怀疑在你的情况下你的应用程序抛出异常但没有崩溃。如果在某些 UI 元素的 ctor 期间引发异常,WPF 应用程序倾向于执行此操作。它可能会破坏渲染堆栈。

我试图重现该问题,但没有成功。从我的测试中,当使用 Windows 7 基本主题(无箭头玻璃)时,我能够获得“Progman”的句柄并将主窗口设置为父窗口。

当我使用 Arrow 主题时,调用 SetParent 会导致窗口消失。一项小小的研究发现了一个可能的解决办法。您可以尝试使用“SysListView32”子窗口(用于保存桌面图标的子窗口),而不是将父窗口设置为“Progman”窗口。

问题是获得“SysListView32”并不容易。它曾经是遍历“Progman”到“SHELLDLL_DefView”然后是“SysListView32”的问题,但是,Windows 7 改变了这一点。'SHELLDLL_DefView' 现在是 WorkerW.... 的一个孩子。

这是我能找到的最好的文章来解释这一点:http: //fernandomachadopirizen.wordpress.com/2010/08/09/give-me-a-handle-and-i-will-move-the-earth/

于 2011-09-25T19:19:58.053 回答