WallpaperEngine 是一款非常受欢迎的动态壁纸软件。有着非常丰富且好看的壁纸库,尤其受各位LSP的欢迎(狗头)。
但是对于如何定制化自己的壁纸,或者如何制作自己喜欢的壁纸,甚至魔改壁纸软件,都是非常麻烦的事情。
如何自己实现一个类似功能的壁纸软件呢?
动态壁纸软件的原理
通过对windows10的桌面窗口分析可以找到一个位于桌面与图标之间的窗口,对它下手就可以达到目的!
具体原理分析 请参考这里!
原文中使用了QT的 WebEngine,这里我们使用CEF来完成,这样会更方便!
思路分析
- 发送一条神奇的windows窗口消息
- 得到WorkerW窗口,并取到句柄
- 将HTML页面通过CEF渲染在WorkerW窗口上
代码与踩坑
神奇的windows窗口消息
这个message似乎会变,上文中的message已经不再适用。
到我写这篇文章时,消息值变成了发送一次 1324,13,0 和一次 1324,13,1 才行。
CEF的使用
虽然我使用的是cefpython3来完成的,但是应该适用于cef的其他语言版本。
官方编译的CEF并不支持MP4解码,需要你重新编译或者使用别人编译的支持MP4版本的CEF(需要相同版本、位数),替换对应的libcef.dll
。
关于CEF的编译有很多文章,但是建议大家采用替换的方式来完成,自己编译太耗时了。
CEF74.1.19+gb62bacf+chromium-74.0.3729.157 libcef.dll 64位
这里是一个我编译过的版本的dll下载地址。
代码与效果
Python代码
from cefpython3 import cefpython as cef
import sys
# 替换python预定义异常处理逻辑,为保证异常发生时能够结束所有进程
sys.excepthook = cef.ExceptHook
# 创建浏览器
info = cef.WindowInfo()
# info.SetAsChild(hwnd) 这里要写你的 WorkerW窗口句柄
setting = {
"default_encoding":"utf8"
}
cef.Initialize()
cef.CreateBrowserSync(url=r"E:\Python\wapper\index.html", window_info=info)
# 消息循环:监听信号和处理事件
cef.MessageLoop()
# 结束进程
cef.Shutdown()
用来渲染的HTML代码
<img src="1.jpg" width="1920px" height="1080px" style="position: absolute;left: 0;top: 0; display: block;">
<img src="2.jpg" width="1920px" height="1080px" style="position: absolute;left: 0;top: 0; display: none;">
<img src="3.jpg" width="1920px" height="1080px" style="position: absolute;left: 0;top: 0; display: none;">
<script src="./jquery.min.js"></script>
<script>
var i = 0
var img_array = $(\'img\')
setInterval(function () {
if (i < img_array.length - 1) {
img_array.eq(i).fadeOut(2000);
img_array.eq(i + 1).fadeIn(2000);
i++;
} else {
img_array.eq(i).fadeOut(2000);
img_array.eq(0).fadeIn(2000);
i = 0;
}
}, 4000);
</script>
代码说明
过程是 HTML代码通过CEF来渲染到桌面上
HTML中是3张图片的轮播,可以换成视频也没关系,理论上只要能正常解析的网页就没关系
Python使用的是Python3.8,cefPython3的库
效果展示
上文的代码只是简易版,这里我写了一个稍复杂的版本。
下载地址
链接: https://pan.baidu.com/s/1VupBoVJIUeCyGJljQZ_qqw
提取码: rkvb