Windows动态桌面原理

测试所用系统版本

OS 名称:Microsoft Windows 10 家庭版;版本 :10.0.14393 暂缺 Build 14393
OS 名称:Microsoft Windows 7   企业版;版本 : 6.1.7600 暂缺 Build 7600(已启用Aero)
本章原理在以上Windows系统版本均已测试成功

原理阐述以及实践操作

Windows顾名思义即窗口的意思,我们平常所接触的桌面、任务栏实际上也是窗口,就和我们所使用的应用软件窗口一样,而且对于开启Aero的Win7和Win10,桌面图标所在的窗口层和桌面背景(壁纸)所在的窗口层不是同一个。通过使用VS自带的工具spy对桌面窗口进行剖析,获取窗口信息,获得下图:

图中窗口类SysListView32(红色箭头所指)即为桌面图标的窗口,可见,正常情况下该窗口是父窗口Progman的子窗口。通过下列代码可以激发窗口发生一个有趣的变化。

在执行了上述代码后,重新使用spy获取桌面窗口的信息,得到下图:

可以轻松的发现,多出了两个WorkerW窗口(蓝线所标),而原来的SysListView32窗口不再以Progman为父窗口,而是以第一个WorkerW窗口为父窗口,这种设计的原因可能是微软为了防止壁纸更换时出现画面撕裂所采取,而动态桌面的原理便是利用这种设计。所谓的动态桌面就是把自己的应用程序嵌入桌面背景的窗口层,比如:把视频用作动态桌面,实际上就是写一个播放视频的程序,然后把该程序的窗口嵌入到桌面背景的窗口。要想实现这种嵌入,需要获取程序的窗口句柄,然后获取桌面背景的窗口句柄,最后通过SetParent函数把程序窗口作为桌面背景窗口的子窗口即可,由于上图中的第二个WorkerW与Progman都可作为桌面背景窗口(桌面背景窗口可以不只一个),对此,下面将分别介绍针对这两个窗口具体操作实现(至于为什么不以第一个WorkerW为父窗口或者以发送特殊消息前的Progman为父窗口SysListView32与你的程序窗口以同一个窗口为父窗口会导致桌面图标与程序处于同一窗口层,就好像一个窗口下的两个控件,不好看啊):
1、程序窗口将Progman作为父窗口

2、程序窗口将第二个WorkerW作为父窗口
代码与上面的代码基本一致,只需要将ShowWindow(workerw,SW_HIDE)删除,并将SetParent(myAppHwnd,windowHandle)的第二个参数更改为workerw即可。

文章打赏

如果您觉得这篇文章对您有帮助的话,可以打个赏支持下,金额随意,感谢您的支持(??????)??!

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114810 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年8月22日
下一篇 2020年8月22日

相关推荐