实际上是什么负责绘制Windows桌面壁纸的呢?

37

我正在尝试开发一个项目,可以使用opengl/directx或GDI对Windows 7桌面壁纸进行动画处理。我研究了Windows桌面窗口的布局方式,并找出了整个"Progman"-> "SHELLDLL_DefView" -> "SysListView32"层次结构。

我尝试钩取SysListView32的WndProc并使用注入的c# dll来操纵消息,以便在强制更改桌面时防止桌面绘制墙纸。但是这些都没有真正停止墙纸的更新,因此我认为explorer.exe实际上并未处理墙纸的绘制。

为了确认这一点,我杀死了explorer.exe,并设置了一个小型c#程序,在10秒定时器上将墙纸更改为随机的一个。正如我所预料的那样,墙纸不断变化,这让我相信explorer.exe实际上并未处理墙纸的绘制!

不幸的是,这就是我完全迷失方向的地方。我不知道还有谁负责绘制墙纸,以及如何接管它的绘制,以便我可以处理绘制。我已经尝试了几天的谷歌搜索,但进展很少。我希望这里的某个人可以指导我朝着正确的方向前进。


18
GetDesktopWindow返回具有壁纸的桌面窗口的句柄。在Windows 7中,此窗口具有内核模式窗口过程win32k!xxxDesktopWndProc(来自win32k.sys),它调用win32k!xxxInternalPaintDesktop。相关函数是win32k!xxxDrawWallpaperwin32k!xxxSetDeskWallpaper。还有用户模式PaintDesktop,最终会调用win32k! xxxInternalPaintDesktop - Eryk Sun
3
@eryksun:这应该是一个答案。 - Yakov Galka
5
VLC媒体播放器具有将视频作为桌面壁纸的功能。您可以查看他们是如何实现的(可能是@eryksun所描述的方式)。 - this.myself
3
@this.myself,我查看了VLC源代码,并成功地复制了它。它只是使用了DirectX叠加层,并将壁纸设置为单一颜色。不幸的是,这对我的目的并不是很有效,因为文字的边缘看起来很奇怪,并且在桌面上拖动选择多个项目会使颜色发生变化,因此叠加层无法绘制选择框的位置。 - logisticalerror
1
BS.Player和VLC都有这个功能。您可以尝试此帖子开始。 - Adrian Stanculescu
显示剩余2条评论
2个回答

1
桌面(包括其上的位图)实际上是由窗口系统自己绘制的。因此,这基本上是相当深入和古老的技术。根据自NT4以来发生的变化,我想绘画实际上是在win32k.sys中完成的。该驱动程序被创建来替换win32.dll,后者会在用户模式下进行所有操作,并进行上下文切换。
这意味着,它符合 erykson 对你的问题所评论的内容:win32k!xxxInternalPaintDesktop 是罪魁祸首。
但是,应该可以获取桌面HWND(0 afaik)的DC并将其附加到您自己的绘图中。不确定是否可以将其转换为DirectX DC,但这取决于您的尝试。
顺便说一句,可以重新父级和捕获外部窗口(HWNDs)和相关设备上下文(DCs)。但是,您可能需要特权或管理员权限。(安全检查)

我已经能够使用GetDC(0)并在其上绘制,但这会在桌面图标上方绘制,因此我无法完全用它来实现我的目的。我将研究如何钩取win32k!xxxInternalPaintDesktop - logisticalerror
你是在图标“上方”绘制,因为资源管理器不会再次绘制。因为资源管理器基本上执行相同的操作。所以这是一个普通的绘图效果(擦除前面的内容)。 - Robetto
所以我应该能够获取资源管理器的 WM_PAINT 事件,进行绘制,然后让资源管理器自己完成绘制? - logisticalerror
听起来好像是可能的。除非...如果资源管理器在绘制之前清除了背景,那就麻烦了。但是除此之外,重新路由或重新发出WM_PAINT消息应该可以让explorer.exe绘制HWND 0。然而:目前还没有具体的想法。 - Robetto

0

桌面窗口管理器负责绘制壁纸。它是作为Windows服务实现的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接