若何实现一个 windows 桌面动态壁纸

6天前 (02-14 14:22)阅读1回复0
kewenda
kewenda
  • 管理员
  • 注册排名1
  • 经验值150625
  • 级别管理员
  • 主题30125
  • 回复0
楼主

更新:

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/Wallpaper​github.com/NoisyWinds/Wallpaper

参考材料:

https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus​www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus

欢送点赞评论,存眷后续文章,一路交换进修。

0
回帖

若何实现一个 windows 桌面动态壁纸 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息