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