更新:
2018/08/31 WS_MOUSE_LL 钩子,实现底层壁纸交互效果。一、介绍
国内玩家第一次看到动态壁纸,都是出于一款来自 Wallpaper Engine 的 Steam 法式。它允许将视频、窗口小部件、以至是有必然交互的网页放置到桌面最下方,2016 岁首年月,被b站up主们普遍传布,被各人熟知。
Miku原理其实其实不难,然而...
前端法式员A:那个 WebGL 特效我能吹一年,赶紧做成壁纸,...什么要写C++的?不成能的,一辈子都不会写中级语言的。
c/c++法式员B:靠...,那帮刁民又想骗我做设想。
Wallpaper Engine 胜利的原因是赢在了不变性、兼容性和玩家老哥构成的丰硕的创意工坊。
那种壁纸小法式,Github上还没有Python 的实现,但是核心办法仅仅是操做win32api,python完全能够实现,你传闻过pywin32吗。。。看完那篇教程,你能够做第一个。
假设你不想领会原理,前端法式员能够间接移步第三步。
二、实现原理本篇文章意在讲解原理,你能够把它当成一个前端法式员的小东西,可能无法到达商用水平。
监听底端事务,容易形成 windows动静梗塞占用大量内存(等于是多挂起了一个阅读器)无法兼容封闭aero的win7 和 win8原理:windows 更底层的窗体 Program Manage (如图所示),想要你的窗体呈现在桌面icon后面,只需要把本身的窗体做为 Program Manage 的子窗体,然后隐藏原先的壁纸层就能够了,win10 你能够选择在原先壁纸之上和icon之下的位置(能够省略隐藏原壁纸),但那种是兼容win7和win10的做法。
你能够利用 Visual Studio的 Spy++来查看 Window的窗体。
我们如今晓得了,workerw 做为我们的图标和壁纸(灰色的workerw,因为已经隐藏)的父窗体呈现在底层窗体之上。
博主你又骗我,为什么我的电脑上,只要一个WorkerW,图标和壁纸都黏在一路了?
那是一条奇异的 message,是 windows 为领会决切换壁纸的时候丑恶的闪切而创建的(未公开动静),它使得改换壁纸的时候有一个光滑的过渡但又不影响绘造壁纸,它会别离创建两个 WorkerW,我们只需要隐藏没有 SysListView (用于存放桌面 icon 的窗体) 的那一个就能够了。
那么接下来,你需要做的就是用winapi遍历找到窗体,完成使命了:
#include <utils.h> HWND _workerw = nullptr; inline BOOL CALLBACK EnumWindowsProc(_In_ HWND tophandle, _In_ LPARAM topparamhandle) { HWND defview = FindWindowEx(tophandle, 0, L"SHELLDLL_DefView", nullptr); if (defview != nullptr) { _workerw = FindWindowEx(0, tophandle, L"WorkerW", 0); } return true; } HWND Utils::GetWorkerW(){ int result; HWND windowHandle = FindWindow(L"Progman", nullptr); SendMessageTimeout(windowHandle, 0x052c, 0 ,0, SMTO_NORMAL, 0x3e8,(PDWORD_PTR)&result); EnumWindows(EnumWindowsProc,(LPARAM)nullptr); ShowWindow(_workerw,SW_HIDE); return windowHandle; }你的窗体需要:
SetParent((HWND)view->winId(),Utils::GetWorkerW());仍是不大白?
github 链接送上:ThomasHuai/Wallpaper
为什么 win8 和 win7(封闭areo)不克不及利用那种办法?
那种情况下,SysListView 被间接当做了 Program Manager 的子窗体,但是那并非关键,关键是壁纸和图标交融在了一路,无论你把你的窗体放到上面位置,都不成能呈现在原壁纸与icon 中间。
三、然而那是一个前端 Demo发布版下载地址:ThomasHuai/Wallpaper
能够利用以下两种体例设置壁纸:
当地途径线上URL(能够copy他人的demo地址)假设你是双屏的能够设置三种屏幕规划:
主屏侧屏平铺(延展至多屏)2018/08/31更新:
利用 WS_MOUSE_LL 钩子,实现底层壁纸交互效果。
壁纸法式利用的是QT的 WebEngine(5.8),chrome 内核阅读器,相当于在屏幕后面挂起了一个阅读器,也就是说 chrome 能做的,它都能够实现,css3动画,webGL,布景音频 + 音频可视化等,自带了一个粒子动画的demo。
粒子动画(自带)three.jsthree.js水中泡泡(自带)涟漪效果(自带)多屏效果:
桌面动态壁纸,藤蔓无限延展Github 项目链接:
NoisyWinds/Wallpapergithub.com/NoisyWinds/Wallpaper参考材料:
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-pluswww.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus欢送点赞评论,存眷后续文章,一路交换进修。