测试所用系统版本

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的子窗口。通过下列代码可以激发窗口发生一个有趣的变化。

//获取Progman的窗口句柄
HWND windowHandle = FindWindow(L"Progman", NULL);
//向Progman发送特殊消息
SendMessageTimeout(windowHandle, 0x052c, 0 ,0, SMTO_NORMAL, 0x3e8,(PDWORD_PTR)&result);

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

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

HWND workerw=NULL;     //第二个WorkerW窗口句柄inline BOOL CALLBACK EnumWindowsProc(HWND handle,LPARAM lparam)
{//获取第一个WorkerW窗口HWND defview = FindWindowEx(handle, 0, L"SHELLDLL_DefView", NULL);if (defview != NULL) //找到第一个WorkerW窗口{//获取第二个WorkerW窗口的窗口句柄workerw = FindWindowEx(0, handle, L"WorkerW", 0);}return true;
}//参数myAppHwnd为你开发的窗口程序的窗口句柄
void SetDesktop(HWND myAppHwnd)
{int result;HWND windowHandle = FindWindow(L"Progman", NULL);SendMessageTimeout(windowHandle, 0x052c, 0 ,0, SMTO_NORMAL, 0x3e8,(PDWORD_PTR)&result);//枚举窗口EnumWindows(EnumWindowsProc,(LPARAM)NULL);//隐藏第二个WorkerW窗口,当以Progman为父窗口时需要对其进行隐藏,//不然程序窗口会被第二个WorkerW覆盖ShowWindow(workerw,SW_HIDE);SetParent(myAppHwnd,windowHandle);
}

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

注意:
1、WorkerW其实不只有两个,本文中的第一个与第二个WorkerW窗口指的是向Progman发送特殊消息后产生的两个窗口,这两个窗口在Z序上邻近,正因为如此,所以我们需要锁定第一个WorkerW,再找到第二个WorkerW;
2、程序窗口嵌入到桌面背景,作为桌面背景后,程序窗口将无法响应你的键盘和鼠标操作,OS不会对其进行聚焦,需要另外进行处理;
3、理论上,这种方法对于其它程序窗口也适用,比如自己开发一个浏览器,你可以把浏览器变为桌面背景;
4、细心的同学会发现,SysListView32桌面图标的父窗口其实为SHELLDLL_DefView,SHELLDLL_DefView的父窗口才是Progman或第一个WorkerW,这里为了方便叙述,省略掉了。

文章打赏

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

Windows动态桌面原理相关推荐

  1. Lively Wallpaper:Windows 10 桌面动态壁纸软件的使用

    一.软件介绍 1.介绍 2.软件说明 3.使用说明 4.软件特点 5.性能和特性 6.软件截图 二.安装步骤 三.基本设置 1.导入本地的视频作为动态壁纸 2.设置开机自启动 3.系统托盘图标显示 4 ...

  2. Zabbix 结合 bat 脚本与计划任务开启 windows 远程桌面

    场景分析 某IT公司的员工小东,在公司部署了一台zabbix用来监控windows系统服务器的一些使用情况.他现在想做到一个功能,就是通过浏览器发现某台windows主机出现内存过高,或者cpu利用率 ...

  3. [网络安全自学篇] 四十四.Windows远程桌面服务缺陷(CVE-2019-0708)复现及防御详解

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了木马原理知识,并通过远程服务器IPC $ 漏洞实现木马植入及控制远程服 ...

  4. 安卓 java 视频_安卓实战项目-动态桌面-rxjava实现搜索本地所有视频

    前言:上一篇文章已经实现了将assets文件中设置成动态壁纸:安卓实战项目-动态桌面-简单实现 需求:既然assets文件能用于动态桌面,那么手机中的视频也可以吧,有没有大胆的想法? 上效果图: 分析 ...

  5. win7 html 设置成桌面,教你怎样设置专属自己的windows7动态桌面

    很多人都喜欢动态的桌面,但是动态桌面难免会有人不会设置,windows7动态桌面设置其实不难的,下面windows7之家小编就教大家win7动态桌面怎么设置. win7系统个性化教程分享: 1. 动态 ...

  6. Windows远程桌面实现之六(新版本框架更新,以及网页HTML5音频采集通讯)

    by fanxiushu 2018-08-21 转载或引用请注明原始作者. 到目前为止,包括本文发布了六个系列,能坚持到现在也属不易. 第一篇: https://blog.csdn.net/fanxi ...

  7. 从零开始用 Windows C++ 桌面程序制作方舟同人游戏(一)

    前言 阅读本博客的前置技能: C++ 基础 好像没了 qwq 为什么开这个坑 很惭愧,虽然每每想要认真的做一个游戏 demo 时,我要么只是停留在了纸面描述上,要么只是建了几个新类,用一个又一个框架/ ...

  8. macOS 动态桌面

    作者:Mattt,原文链接,原文日期:2018-10-01 译者:saitjr:校对:冬瓜,Yousanflics:定稿:Forelax Dark Mode(深色模式)可谓是 macOS 最受欢迎的特 ...

  9. Windows远程桌面(RDP)密码凭证获取 (゚益゚メ) 渗透测试

    文章目录 Windows远程桌面(RDP) 查看连接记录 获取连接密码 Windows远程桌面(RDP) Windows自带的远程桌面功能非常强大,大部分Windows集群管理员都会直接使用远程桌面, ...

  10. 安卓桌面壁纸_火莹视频桌面:好玩的动态桌面壁纸软件,让你的桌面动起来

    前言 每天都看着静止的桌面壁纸会不会感到有些无聊呢? 今天分享一款动态桌面壁纸软件,带你打开新世界的大门--「火莹视频桌面」,让我们的桌面动起来!φ(゜▽゜*)♪ 火莹视频桌面 火莹视频桌面是一款桌面 ...

最新文章

  1. 难以置信的目标检测小妙招:多训练几个epochs,平均一下就能获得更好的模型...
  2. 百科知识 .tar.xz文件如何打开
  3. Houdini Krakatoa Render Plugin
  4. proxy error: could not proxy request解决方案
  5. 截取指定字符前_VBA学习笔记35-1:字符串拆分与组合
  6. java while do_java中while和do-while的总结
  7. c语言代码含义大全,小白求解代码各部分意思
  8. 【Servlet】Servlet显示时间和IP等信息
  9. WCF必知必会以及与Webapi的区别
  10. vue混合开发笔记, this的指向
  11. # SDN第五次上机作业
  12. 恒大汽车参展车辆竟全都是模型;华为官宣卖车,门店连夜上新摆车...
  13. Colidity-- Dominator
  14. snprintf与sprintf的区别
  15. nvidia控制面板点了没反应win7_nvidia控制面板打不开,教你win7系统nvidia控制面板打不开的解决方法...
  16. onvif 模拟摄像头_ONVIF协议测试工具(ONVIF Device Test Tool)
  17. 前端模板引擎 -- Freemarker
  18. 五、组织机构模块-部门管理
  19. findfont: Font family [‘Times New Roman‘] not found. Falling back to DejaVu Sans.字体安装
  20. 机器学习与统计建模 —— 归一化和标准化

热门文章

  1. 液压外部测试系统软件,液压测试系统的软件设计
  2. rapidxml学习记录
  3. 【weblogic部署应用】
  4. 谁“杀死”了杀毒软件
  5. 电脑常用良心软件推荐!!!
  6. linux服务器上的cad病毒,Linux挖矿病毒的清除与分析
  7. 安装vc2005运行库错误1935c处理
  8. 如何判断一个网页是否更新
  9. 内网渗透(一)——本机信息收集
  10. Apache Commons BeanUtils包学习 2 -beanutils PropertyUtils bean