我正在尝试一个项目,我可以使用opengl/directx或GDI为Windows 7墙纸设置动画。我研究了Windows桌面窗口的布局方式,并弄清了整个过程

“Progman”->“SHELLDLL_DefView”->“SysListView32”

等级制度。
我尝试挂钩SysListView32的WndProc,并尝试使用注入(inject)的C#dll弄乱消息,以便当我使用“控制面板”->“个性化”菜单强制更改墙纸时,可以防止桌面绘制墙纸。这些都没有真正阻止墙纸的更新,因此我发现explorer.exe实际上不处理绘制墙纸。

为了确认这一点,我杀死了explorer.exe,并设置了一个小的C#程序,该程序将10秒计时器上的墙纸更改为随机的墙纸。如我所料,墙纸一直在变化,这使我相信explorer.exe实际上并不处理墙纸的绘制!

不幸的是,这是我完全迷失的地方。我不知道还有什么要负责绘制墙纸,以及如何接管墙纸,以便可以处理该墙纸。我尝试使用Google进行搜索已有几天,但进展甚微。我希望这里的人可以引导我朝正确的方向发展。

最佳答案

桌面(包括其上的位图)实际上是由窗口系统本身绘制的。因此,这基本上也很古老。因此,根据自NT4以来发生的变化,我认为绘画实际上是在win32k.sys中完成的。该驱动程序的创建是为了替换win32.dll,该程序本可以通过上下文切换在用户模式下完成所有操作。

也就是说,这与erykson对您的问题的评论一致:win32k!xxxInternalPaintDesktop是坏人。

但是,应该可以获取桌面HWND的DC(0 afaik)并将其附加到您自己的图形上。不知道是否可以将其转换为DirectX DC,但这取决于您尝试。

顺便提一句。可以重新父级并捕获外部窗口(HWND)和关联的设备上下文(DC)。但是,您可能需要获得特权或成为管理员。 (已检查安全性)

关于c# - 什么实际上处理Windows墙纸的绘制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30636208/

10-13 03:25