在WPF中使用带有SetParent的Show Desktop问题

时间:2011-09-24 23:41:24

标签: c# wpf setparent

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

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

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

1 个答案:

答案 0 :(得分:2)

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

我试图重现这个问题,但没有成功。根据我的测试,我能够获得'Progman'的句柄,并在使用Windows 7基本主题(没有箭头玻璃)时将主窗口设置为父窗口。

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

问题是获取'SysListView32'并不容易。它曾经是通过'Progman'遍历'SHELLDLL_DefView'然后'SysListView32'的问题,然而,Windows 7改变了这一点。 'SHELLDLL_DefView'现在是一个工作者的孩子....有时候。

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