我正在尝试开发一个项目,可以使用opengl/directx或GDI对Windows 7桌面壁纸进行动画处理。我研究了Windows桌面窗口的布局方式,并找出了整个"Progman"-> "SHELLDLL_DefView" -> "SysListView32"层次结构。
我尝试钩取SysListView32的WndProc并使用注入的c# dll来操纵消息,以便在强制更改桌面时防止桌面绘制墙纸。但是这些都没有真正停止墙纸的更新,因此我认为explorer.exe实际上并未处理墙纸的绘制。
为了确认这一点,我杀死了explorer.exe,并设置了一个小型c#程序,在10秒定时器上将墙纸更改为随机的一个。正如我所预料的那样,墙纸不断变化,这让我相信explorer.exe实际上并未处理墙纸的绘制!
不幸的是,这就是我完全迷失方向的地方。我不知道还有谁负责绘制墙纸,以及如何接管它的绘制,以便我可以处理绘制。我已经尝试了几天的谷歌搜索,但进展很少。我希望这里的某个人可以指导我朝着正确的方向前进。
GetDesktopWindow
返回具有壁纸的桌面窗口的句柄。在Windows 7中,此窗口具有内核模式窗口过程win32k!xxxDesktopWndProc
(来自win32k.sys),它调用win32k!xxxInternalPaintDesktop
。相关函数是win32k!xxxDrawWallpaper
和win32k!xxxSetDeskWallpaper
。还有用户模式PaintDesktop
,最终会调用win32k! xxxInternalPaintDesktop
。 - Eryk Sun