更新:

  • 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的做法。

欢迎光临程序代写小店https://item.taobao.com/item.htm?spm=a230r.1.14.59.255028c3ALNkZ0&id=586797758241&ns=1&abbucket=15#detail

matlab程序代写C++代做C语言java安卓app设计python网站php代码 一流985硕博团队为您服务

可直接联系客服QQ交代需求:953586085

你可以使用 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.js

three.js

水中泡泡(自带)

涟漪效果(自带)

多屏效果:

桌面动态壁纸,藤蔓无限延展

Github 项目链接:

NoisyWinds/Wallpaper​github.com

参考资料:

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

欢迎点赞评论,关注后续文章,一起交流学习。

如何实现一个 windows 桌面动态壁纸的更多相关文章

  1. C++使用代码创建一个Windows桌面应用程序

    WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HINSTANCE hInstancem HINSTANCE hPreInstance, ...

  2. 使用PHP-GTK编写一个windows桌面应用程序

    PHP-GTK的下载地址:http://gtk.php.net/download.php?language=en-US, 猿哥选择了最新版本(beta版),可能有人会问我们为啥不选最新的stable版 ...

  3. Windows KB2984972安装后堵住了一个windows 7 桌面可以多个用户远程访问桌面的漏洞。

    之前网络上有方法可以实现2个用户同时使用一个windows 7,一个在终端,一个通过远程桌面. 安装了这个kb后,就无法同时登陆了,同一时间只有一个用户可以登陆windows 7

  4. 为你的Windows7设置动态壁纸

    From:http://www.cnblogs.com/killerlegend/p/3644014.html By KillerLegend DreamScene是Vista上的一个功能,可以让你设 ...

  5. android浪漫樱花凋零动态壁纸应用源码

    android浪漫樱花凋零动态壁纸应用源码,是从那个安卓教程网拿过来的,本项目是一套基于安卓的樱花动态壁纸项目源码,安装以后桌面没有图标,但是可以在修改壁纸-动态壁纸中找到.我的分辨率是480×854 ...

  6. Win32++:可替代MFC的Windows桌面应用开发框架

    写在前面 有过Win32编程经验的朋友都知道,使用Windows提供的API开发桌面应用是相当繁琐的,创建一个功能简单能接收并处理消息的窗口至少也得几百行代码.创建一个可视化的窗口一般要以下几个步骤: ...

  7. 适用于Windows桌面应用程序的.NET Core 3

    介绍 9月,微软发布了新版.NET Core,用于构建Windows桌面应用程序,包括WPF和Windows Forms.从那时起开发人员可以将传统的nfx桌面应用程序(和控件库)迁移到.NET Co ...

  8. python学习笔记 | macOS Big Sur动态壁纸食用指南

    目录 前言 爬虫篇 壁纸使用篇 后记 前言 北京时间23日凌晨1点,苹果WWDC2020大会开幕.在发布会上,苹果正式发布了新版macOS,并将其命名为"Big Sur". 相比于 ...

  9. Python与Windows桌面

    Python更换windows桌面 目录 Python更换windows桌面 前言 准备工作 代码 效果展示 Tips-如何更有仪式感 前言 每天下班,有时候会留下一些事情需要明天更进 为了防止忘记, ...

随机推荐

  1. Java内存模型学习笔记(一)—— 基础

    1.并发编程模型的分类 在并发编程中,我们需要处理两个关键的问题:1.线程间如何通信,2.线程间如何同步.通信是指线程之间以何种机制来交换信息,同步是指程序用于不同线程之间操作发生相对顺序的机制. 在 ...

  2. Go 互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)

    什么时候需要用到锁? 当程序中就一个线程的时候,是不需要加锁的,但是通常实际的代码不会只是单线程,所以这个时候就需要用到锁了,那么关于锁的使用场景主要涉及到哪些呢? 多个线程在读相同的数据时 多个线程 ...

  3. 转载 AI-Talking 图算法

    https://mp.weixin.qq.com/s/2XRgJr-ydxHA3JxAZ_5HeA 图算法在风控业务的实践 直播行业中有很多业务风控问题,比如说批量注册.刷热度.垃圾信息以及薅羊毛等. ...

  4. Linux文件(夹)属性

    ll  或者 ls -lh 查看文件属性:

  5. linux uniq命令用法

    uniq命令: 对指定的ASCII文件或标准输入进行唯一性检查,以判断文本文件中重复出现的行,常用于分析日志:查看tcp各个状态连接数,ip或域名连接数排名等等场景,一般与 sort 命令结合使用. ...

  6. 【Mybatis】 入门

    一.概述 1.1 JDBC 1.2 JDBC编程中问题 1.3 MyBatis介绍 1.4 Mybatis架构 二.MyBatis入门程序 2.1 需求 2.2 引入MyBatis依赖 2.3 配置 ...

  7. Needham-Schroeder协议的形式化描述语言

    1.对TLS1.3协议形式化描述过程 第一步:   Needham-Schroeder 过程的分析 常量和变量的定义: /* * Needham-Schroeder过程的形式化描述 */ // THE ...

  8. Linux提供哪些功能

    不只是Linux,任何一个OS几乎都具有如下功能. 1.文件IO:读写文件 初级文件IO 2.文件属性:获取文件信息 3.标准IO:读取文件系统函数 4.获取IS系统信息 5.进程环境 6.进程控制 ...

  9. Windows10 临时将线程绑定至指定CPU的方法

    本文首发:https://www.somata.work/2019/WindowsThreadBind.html 将线程绑定至指定CPU,这个应该时很多管理员需要了解认知的操作了吧,这样可以在一定程度 ...

  10. k8s的容器编排

    1.K8S是如何对容器编排? 在K8S集群中,容器并非最小的单位,K8S集群中最小的调度单位是Pod,容器则被封装在Pod之中.由此可知,一个容器或多个容器可以同属于在一个Pod之中. 2.Pod是怎 ...