C#设置桌面图标背后的窗口

时间:2009-12-30 02:20:59

标签: c# windows winapi handle

假设我在屏幕上的0,0坐标处有一个100px到100px的空表单。它没有边框风格。有没有办法让这个位于桌面图标后面?

我认为这将涉及Progman进程,因为这包含桌面图标。但无论我尝试什么...获取窗口句柄和更改父母等,我似乎无法让窗口出现在图标后面。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

基本上你想在桌面上绘制壁纸。桌面层次结构如下所示:

"Program Manager" Progman
  "" SHELLDLL_DefView
    "FolderView" SysListView32

实际绘制桌面图标的是SysListView32,这就是你必须挂钩的东西。而且你不能只是把你的形式贴在它上面;你必须抓住WindowDC到那个手柄并在DC上画画。

可以完成 - 已经已完成,但您将使用大量互操作。忘记使用传统的Winforms表单执行此操作。我认为我甚至没有看到它在C#中完成,尽管有人在python中做过,如果这有帮助的话。我自己不是一个python编码器,但代码非常简短易懂。

答案 1 :(得分:2)

至少对于Windows 8,这个问题有一个解决方案。我以CodeProject上的一篇文章的形式发布它,所以你可以在这里阅读它:

http://www.codeproject.com/Articles/856020/Draw-behind-Desktop-Icons-in-Windows

这适用于简单绘图,Windows窗体,wpf,directx等。该文章中提供的解决方案仅适用于Windows 8.

答案 2 :(得分:1)

Google-fu带我到这个MSDN论坛问题:

http://social.msdn.microsoft.com/Forums/en/winformsdesigner/thread/c61d0705-d9ec-436a-b0a6-6ffa0ecec0cc

这是一篇博文,关注使用GetDesktopWindow()或处理桌面句柄的主要缺陷(根据您的其他问题:C# Position Window On Desktop

http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx

  

您也不希望将GetDesktopWindow()作为hwndParent传递。如果您创建父窗口为GetDesktopWindow()的子窗口,则您的窗口现在粘贴到桌面窗口。如果你的窗口调用类似MessageBox()的东西,那么这是一个模态对话框,然后上面的规则启动,桌面被禁用,机器就是吐司。

无论如何,我怀疑它可能已经完成,但你是否应该是另一个问题。