2023-07-07 150
网管小贾 / sysadm.cc
最近小伙伴叫小旺,最近和女友在追综艺节目《一年一度的喜剧大赛》。
该节目播出以来,形式年轻化,多玩化,剧本也是脑洞频出,创意无限,极具特色,深受年轻人的追捧。
有这样一部小品《先生请出山》,被创作者自称陷阱喜剧,播出后突然在网上爆炸。
不,小旺和他的女朋友也着迷了,上瘾了,问我能不能把这个视频放在桌面上,这样就不能再看了,又显得酷了?
有这么让人痴迷吗?
我真的有点不相信。结果看了魔舞和风骚的走路,再也出不来了!
嘿嘿,没错,被成功洗脑的我,现在也时常动不动就想模仿一下那舞步的动作。
现在大多数年轻人不抽烟不喝酒也只是为了点这些乐子,理解理解!
我告诉小旺,动态桌面壁纸程序不多,下载就用。
可我得到的回复是,这些软件不是收费的就是里面夹带私货的,都不怎么让人放心,问有没有靠谱点的方法。
也是哈,所以我研究了好几天,最后成功把这个魔舞视频当成了动态桌面壁纸!
本文结尾有自制程序下载,免费、安全、可靠,无私货~
实验平台Windows 10 (默认开启 Aero )
目标效果基本上可以在桌面上播放视频,达到动态桌面的效果。
同时,不妨碍日常操作,如桌面图标点击、移动等。
工具介绍除了编程工具,在正式开始了解原理之前,我们还需要请出窗口句柄抓取工具:Microsoft Spy 。
它是来自 Vistual Studio 可提供系统过程、线程、窗口和新闻图形视图的实用工具。
当然,如果您熟悉这一点,也可以使用其他窗口句柄查看工具。
但是,如果你不知道什么是窗口句柄,那也没关系。我给你简单解释一下。你可能知道。
首先,我们应该知道,在系统中,窗口(或窗口)是最常用和最基本的容器载体,窗口中有许多不同的控制器,用于操作系统功能或与用户互动。
窗户很重要,那么如何管理这些窗户呢?
很简单,系统会分配给这些窗口ID,这个ID就叫作句柄(Handle)。
这些窗口的句柄就像身份证号码。当我们想操作它们时,告诉系统它们的身份证ID也就是窗口句柄。
那么 Spy 可以提供图形参考,让我们知道哪个窗口是哪个句柄。
桌面壁纸原理事实上,我们的系统由许多窗口组成,有些是可见的,有些是看不见的(隐藏或透明的),有些是可见的,但不能直接访问,有些甚至看不见我们也可以操作它,简而言之,所有这些窗口都堆叠在我们面前。
你只需要把这些窗户想象成许多不同的玻璃,就像照镜子一样,从近到远站在你面前,有的透明,有的不透明。
所以对于桌面来说,它也是一块玻璃(一个窗口),但它有点特别,里面有几个小玻璃(子窗)。
因此,如果我们对窗口的概念有一个大致的了解,我们可以使用它 Spy 观察它是什么样子。
桌面窗的原貌如下图所示,通过 Spy 展开当前窗口的句柄树,很容易知道桌面窗口是怎么套娃的。
顶部是桌面窗口的句柄,下面有许多个子窗口。
关键是名字对我们有用 Program Manager 子窗是我们苦苦寻找的桌面背景,包括包含壁纸和图标的子窗。
简单来说,桌面窗口就像下面这样。
|- "Program Manager" Progman // 总体桌面|--- "" SHELLDLL_DefView // 负责显示桌面图标|----- "FolderView" SysListView32 // 控制桌面图标排序顺序|------- "" SysHeader32 // 隐藏窗口,功能不详
在这些窗口 "" SHELLDLL_DefView 桌面图标窗口。
简单说一下,引号是 窗口标题 ,而后面则是 类名 ,比如 "Program Manager" 是窗口标题,还有 Progman 是类名。
简单说一嘴,引号里是 窗口标题 ,而后面则是 类名 ,比如 "Program Manager" 是窗口标题,还有 Progman 是类名。
了解窗口的标题和类名将非常有利于我们找到定位窗口,从而便于操作。
直接嵌入 Progman窗口中行吗
根据前面的介绍,我们很容易得出结论,既然桌面壁纸和图标属于不同的子窗口,我们能在图标下方插入我们的程序窗口吗?
理论上的想法是对的,但是经过我的实际测试,很遗憾根本达不到这样的效果!
设置程序窗口 Progman 子窗,虽然跑到了所有窗口的最后,但不能显示在图标后面。
那有什么问题呢?
多桌面冒出来 WorkerW
原来我们用的是 Windows 10 虽然它默认支持系统,但它支持它 Aero 但它也有多桌面的新功能,你只需要按一下 Win Tab 键就能看到。
这种多桌面功能会使桌面窗口发生奇妙的变化,系统会产生多个 WorkerW 窗户出来了。
这个 WorkerW 我们可以简单地理解为切换桌面的小窗口,但现在有很多。
跑出这么多 WorkerW 在窗户里,有一个会把原来的 Progman 下面的子窗抢过去,就像下图一样。
嗯,这是一件坏事!
我们按照 Progman 窗口找到桌面图标背景的方法完全无效!
那为什么要搞这么多呢? WorkerW 它不能愉快地使用 Progman 吗?
事实上,官方解释说,为了使桌面切换呈现平滑过渡的效果,设计使用了多个 WorkerW 窗户,否则效果会让你想砸电脑。
好吧,道理大家都懂,那接下来怎么整呢?
既然 Progman 下面的子窗被抢走了。我们能试着找到这个吗? SHELLDLL_DefView 类子窗口的 WorkerW ,然后把你程序的窗口放在它后面作为子窗口?
尽量嵌入程序窗口 WorkerW
经过一番折腾,我发现即使找到了目标, WorkerW ,把程序窗口放在下面仍然不起作用。
如下图所示,虽然程序窗口已经跑到了所有窗口的最后,但它仍然停留在桌面图标的前面,效果是将程序窗口挂在前面 Progman 下面是一样的。
现在我很困惑,为什么这不行,那也不行?
其实这里有一个套路,这个套路真的让我想了很久!
什么套路,我们往下看!
我在网上查阅了很多信息。在不断的实验中,我发现除了有子窗口之外,我还发现了 WorkerW 其他一切 WorkerW 都是隐藏的。
实际有效的做法是,我们需要
将程序窗口嵌入到第二个可见的非隐藏的窗口中 WorkerW 之上才行。
注意它有两个特点,一是排名第二,不含子窗,二是可见的非隐藏属性。
让 WorkerW窗户可见且透明
我们前面说过,按下 Win Tab 键可以切换多个桌面,当我们这样切换时,系统会产生多个 WorkerW 过渡切换效果采用窗口。
因此,我们可以用程序模拟按下它 Win Tab 键。
然而,在我试图模拟按钮后,我发现窗口闪烁,状态不理想,所以我在网上找到了信息。
根据网上资料,Windows 当我们向前走时,有一个系统保留消息 Progman 窗口发送 0x052C 消息时,桌面会产生透明度 WorkerW 窗户,同时将 Progman 子窗转移到新生成的子窗口 WorkerW 之下。
正是我们前面看到的,子窗被抢了。
需要注意的是,这是 Vista 后续版本有效,嗯,可以理解为打开 Aero 系统的效果。
我用 VB 就像下面这样,代码很容易实现。' 获取 Progman 句柄lngDesktopHwnd = FindWindow("Progman", vbNullString)' 然后向 Progman 发送 0x052C 使其产生 WorkerWSendMessage lngDesktopHwnd, &H52C, 0, 0
全面寻找目标 WorkerW窗口
我们想要的 WorkerW 在窗户之后,我们必须找到找到目标窗口的方法,即第二个可见的窗口 WorkerW 窗口。
切记,这个 WokerW 窗户是可见的,不是隐藏的,不包括任何子窗。
切记,这个 WokerW 窗户是可见的,不是隐藏的,不包括任何子窗。
我的遍历算法可以使用,但灰色往往很粗糙。你可以简单地参考并自己改进。' 获取桌面句柄lngDesktopHwnd = GetDesktopWindow' 获得第一个 WorkerW 窗口句柄lngWorkerW = FindWindowEx(lngDesktopHwnd, 0, "WorkerW", vbNullString)' 将临时类名定义为比较和搜索多个同级别 WorkerW 窗口Dim lpClassName As String' 遍历所有 WorkerW 直到找到不拥有 SysListView32 窗户的那个 WorkerW 为止!Do While lngWorkerW > 0 If IsWindowVisible(lngWorkerW) Then lngShellDll = FindWindowEx(lngWorkerW, 0, "SHELLDLL_DefView", vbNullString) If lngShellDll = 0 Then Exit Do Else ' 找到下一个同级窗体句柄 lpClassName = Space(255) Do While UCase(Left(lpClassName, 7))
原文链接:https://000nw.com/2551.html
=========================================
https://000nw.com/ 为 “电脑技术吧” 唯一官方服务平台,请勿相信其他任何渠道。
电脑技术 2023-07-23
应用技巧 2023-07-23
系统教程 2023-07-23
系统教程 2023-07-23
软件办公 2023-07-11
软件办公 2023-07-11
软件办公 2023-07-12
软件办公 2023-07-12
软件办公 2023-07-12
系统教程 2023-07-23
扫码二维码
获取最新动态