假设我在屏幕上的 0,0 坐标处有一个 100 像素 x 100 像素的空表单。它没有边框样式。有没有办法把它放在桌面图标后面?
我认为这将涉及 Progman 进程,因为这就是包含桌面图标的内容。但无论我尝试什么...获取窗口句柄和更改父母等,我似乎都无法让窗口出现在图标后面。
有任何想法吗?
本质上你想在桌面壁纸上画画。桌面层次结构如下所示:
"Program Manager" Progman
"" SHELLDLL_DefView
"FolderView" SysListView32
它SysListView32
实际上绘制了桌面图标,所以这就是你必须挂钩的。而且你不能只是把你的表格贴在上面;你必须抓住WindowDC
那个手柄并在 DC 上画。
它可以完成——它已经完成了,但是你将使用大量的互操作。忘记使用传统的 Winforms 表单执行此操作。我认为我什至没有在 C# 中看到过它,尽管有人在python中做过,如果有帮助的话。我自己不是 python 编码器,但代码非常简短且易于理解。
这个问题有一个解决方案,至少在 Windows 8 上是这样。我以 CodeProject 上的文章的形式发布了它,所以你可以在这里阅读:
http://www.codeproject.com/Articles/856020/Draw-behind-Desktop-Icons-in-Windows
这适用于简单的绘图、windows 窗体、wpf、directx 等。该文章中提出的解决方案仅适用于 Windows 8。
Google-fu 将我带到了这个 MSDN 论坛问题:
这是一篇关于使用 GetDesktopWindow() 或处理桌面句柄的主要陷阱的博客文章(根据您的其他问题:C# Position Window On Desktop)
http://blogs.msdn.com/oldnewthing/archive/2004/02/24/79212.aspx
您也不想将 GetDesktopWindow() 作为您的 hwndParent 传递。如果您创建一个父窗口为 GetDesktopWindow() 的子窗口,则您的窗口现在粘在桌面窗口上。如果您的窗口随后调用 MessageBox() 之类的东西,那么这是一个模态对话框,然后上面的规则就会启动,桌面会被禁用,机器会吐司。
无论如何,我怀疑它可能可以完成,但你是否应该是另一个问题。