什么实际处理 Windows 壁纸的绘图?

Posted

技术标签:

【中文标题】什么实际处理 Windows 壁纸的绘图?【英文标题】:What actually handles the drawing of the Windows Wallpaper? 【发布时间】:2015-08-18 14:44:29 【问题描述】:

我正在尝试一个项目,我可以使用 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!xxxDrawWallpaperwin32k!xxxSetDeskWallpaper。还有用户模式PaintDesktop,最终调用win32k!xxxInternalPaintDesktop @eryksun:这应该是一个答案。 vlc 媒体播放器具有将视频显示为桌面墙纸的功能。你可以看看他们是怎么做的(可能是@eryksun 描述的方式) @this.myself,我查看了 VLC 源代码,并设法复制了它。它只是使用 DirectX Overlay 并将壁纸设置为单一颜色。不幸的是,这对我的目的不是很好,因为文本的边缘看起来很奇怪,并且在桌面上拖动以选择多个项目会使颜色发生变化,因此覆盖不会在选择框所在的位置绘制。 BS.Player 和 VLC 都有这个功能。您可以尝试 [this post][1] 开始。 [1]:***.com/questions/12416960/… 【参考方案1】:

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

这就是说,这符合 erykson 对您的问题的评论:win32k!xxxInternalPaintDesktop 是坏人。

但是应该可以获取桌面 HWND (0 afaik) 的 DC 并将其附加到您自己的绘图中。不确定您是否可以将其变成 DirectX DC,但这取决于您是否可以尝试。

顺便说一句。可以重新创建和捕获外部窗口 (HWND) 和关联的设备上下文 (DC)。但是,您可能需要有特权或管理员。 (安全检查)

【讨论】:

我已经能够 GetDC(0) 并绘制到它,但这绘制在桌面图标之上,所以我不能完全将它用于我的目的。我会考虑以某种方式挂钩win32k!xxxInternalPaintDesktop 您正在“上方”绘制图标,因为资源管理器不再在您之后绘制。因为 Explorer 基本上是这样做的。所以这是一个普通的painter效果(一个擦掉prev) 所以我应该可以抓取 Explorer 的 WM_PAINT,然后进行我的绘画,然后让 Explorer 进行绘画? 听起来有可能。除非……如果资源管理器想在绘制之前清除背景,那你就完蛋了。但否则应该可以重新路由或重新发出 WM_PAINT 消息以使 explorer.exe 绘制 HWND 0。但是:现在没有具体的想法。【参考方案2】:

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

【讨论】:

以上是关于什么实际处理 Windows 壁纸的绘图?的主要内容,如果未能解决你的问题,请参考以下文章

python气象绘图windrose

ffmpeg/camera实现最近很火的视频壁纸,相机壁纸

Windows10为啥锁屏界面没有壁纸?

屏幕保护程序如何在 Windows 8 中继续在桌面上绘图?

为啥win10锁屏壁纸会自动变成Windows聚焦?

获取Windows10 聚焦壁纸