大气闪动壁纸怎么用,开灯特效壁纸设置方法

首页 > 技术 > 作者:YD1662023-04-16 11:37:59

这下我就懵了,怎么这也不行,那也不行呢?

实际上这里是有一个套路的,而这个套路着实让我琢磨了很久很久!

什么套路呢,咱们往下看!

我查阅了网上大量的资料,在不断的实验中我发现除了拥有子窗口的 WorkerW 之外,其他所有的 WorkerW 都是隐藏不可见的。

大气闪动壁纸怎么用,开灯特效壁纸设置方法(9)

而实际有效的做法是,我们需要将程序窗口嵌入到第二个可见非隐藏的 WorkerW 之上才行。

注意它的特点有两个,第一是排名第二并不含有子窗口,第二是可见非隐藏属性。

让 WorkerW窗口可见并且变透明

前面我们说过,按下 Win Tab 键可以切换多桌面,当我们这么一切换时,系统就会产生多个 WorkerW 窗口用于过渡切换效果。

所以我们可以用程序模拟按下 Win Tab 键。

不过我尝试模拟按键后,发现有窗口闪动的现象,不是太理想的状态,于是我找到了网上的资料。

根据网上资料,Windows 有一个系统保留消息,当我们向 Progman 窗口发送 0x052C 消息时,桌面就会生成一个透明的 WorkerW 窗口,同时会将 Progman 的子窗口转移到这个新生成的 WorkerW 之下。

这也正是我们前面所看到的,子窗口被“抢过去”的效果。

需要注意的是,这是在 Vista 之后的版本才有效,嗯,可以理解为开启 Aero 效果的系统。

我用 VB 代码很容易就实现了,就像下面这样。

' 获取 Progman 句柄 lngDesktopHwnd = FindWindow("Progman", vbNullString) ' 然后向 Progman 发送 0x052C 使其产生 WorkerW SendMessage lngDesktopHwnd, &H52C, 0, 0遍历查找目标 WorkerW窗口

生成了我们想要的 WorkerW 窗口后,我们就要想办法去找到那个目标窗口,也就是第二个可见的 WorkerW 窗口。

切记,这个 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)) <> UCase("WorkerW") lngWorkerW = GetWindow(lngWorkerW, GW_HWNDNEXT) GetClassName lngWorkerW, lpClassName, 255 Loop End If Else ' 查找下一个同级的类窗体句柄 lpClassName = Space(255) Do While UCase(Left(lpClassName, 7)) <> UCase("WorkerW") lngWorkerW = GetWindow(lngWorkerW, GW_HWNDNEXT) GetClassName lngWorkerW, lpClassName, 255 Loop End If Loop将程序窗口变成目标 WorkerW窗口的子窗口

看到没,就像下图这样,我们的程序窗口跑到了第二个可见 WorkerW 的下面了。

大气闪动壁纸怎么用,开灯特效壁纸设置方法(10)

参考代码如下:

' 将程序窗口设定为 WorkerW 的子窗口,WorkerW 成为父窗口 lngOriginalParentHwnd = SetParent(Me.hwnd, lngWorkerW) ' 最后在程序退出时别忘记再变回来 lngTmpHwnd = SetParent(Me.hwnd, lngOriginalParentHwnd)

最后,我们看到了这样的效果,窗口终于跑到了图标的后面,耶!

大气闪动壁纸怎么用,开灯特效壁纸设置方法(11)

效果演示

后续还有很多工作需要继续,比如播放器的操作控制,前景布局等等。

不过这些繁杂的事不算主要问题,我们只要基本能够实现桌面动态播放视频即可。

就像下面,效果还算可以吧。

点击浏览,选择视频文件。

大气闪动壁纸怎么用,开灯特效壁纸设置方法(12)

上一页1234下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.