DesktopFX v1.3.0 60.0 帧/秒 9.0 毫秒/帧 特效 13 · 预设 10
Win32 layered overlay · 纯 Python · 零 GUI 框架

给 Windows 桌面
加一层会呼吸的天气

纯 Python 写的桌面特效程序。下雨、下雪、落樱、流星雨覆盖整块屏幕(含多显示器), 聚光灯、颜料盘、真实水波、宠物跟随跟着鼠标走, 点击表情、点击文字、点击音效在光标处炸开。 覆盖层鼠标事件完全穿透,不拦截任何一次点击。

完整演示 13 种特效逐个实拍 · 鼠标轨迹与点击都是真的在动

▸ 这段视频里的每一帧,都是用 DesktopFX 自己的渲染引擎离线跑出来的 —— 与你桌面上跑的是同一份代码、同一份参数,不是另做的演示动画。 画面里的光标会真的移动、真的按下: 聚光灯跟着光标亮、颜料被它搅动、小猫沿它划过的路线跟上来、爱心在它点下的位置炸开。

01 / 效果一览

13 种特效,按驱动方式分五类

不是「全都能同时开」—— 同类的默认互斥,新开一个会自动关掉另一个。 需要雨雪同屏时,在设置里打开「允许多开」。 上半段是氛围特效(自己布满屏幕),下半段要靠鼠标带出来。

下雨特效实拍:三档景深的雨丝落在桌面窗口之上全屏特效

下雨

三层景深,雨丝随速度拉长,落地溅起水花。风偏、雨量、浓度都能实时调。

3 层景深风偏溅水花
下雪特效实拍:三档景深的雪花落在桌面窗口上全屏特效

下雪

按深度分三档近大远小,远雪压住近雪(画家算法)。逐粒子亮度脉动,近雪带辉光,另有独立风速与双正弦阵风。

3 档景深闪烁/辉光阵风
落樱特效实拍:粉色花瓣在浅色桌面上翻面全屏特效

落樱

花瓣按「主体 → 边缘泛白」双色渐变,带自旋与翻面 —— 翻到侧立时面积收扁、颜色偏白。

双色渐变自旋翻面逐片相位
流星雨特效实拍:头部辉光与渐隐拖尾划过星空全屏特效

流星雨

斜向高速掠过的彗星。轨迹按间距采样成一串圆盘盖章,尾部不会串成珠子,可叠加一层星空。

头部辉光拖尾渐隐静态星空
聚光灯实拍:鼠标变成一盏灯,光圈外整屏压暗鼠标拖动特效

聚光灯

鼠标变成一盏灯:光圈里是亮的,光圈外整屏压暗,把注意力锁在光标周围。

柔边光洞压暗可调
鼠标涟漪实拍:光标划过荡开一圈圈同心圆环鼠标拖动特效

鼠标涟漪

光标划过荡开一圈圈涟漪,多层同心圆环 + 真实 alpha 衰减,越远越淡。

多层圆环触发灵敏度
真实水波实拍:桌面被当成水面,明暗条纹随波起伏鼠标拖动特效

真实水波

把桌面当成一片水。波会向外传播、相互干涉、撞到边缘反射 —— 这是真的波动方程。

二维波动方程迎光/背光
颜料盘实拍:鼠标搅出的彩色流体丝带鼠标特效

颜料盘

鼠标搅动的流体颜料。笔触被拖出、卷成涡、拉成丝,停手后继续涡旋再慢慢消隐。

半拉格朗日平流curl 基流色相渐变
宠物跟随实拍:小猫沿鼠标划过的路线排成一列跟上来鼠标特效

宠物跟随

小猫小狗沿你划过的路线一路跟上来,最多 10 只排成一列。形象由代码绘制,不依赖任何图片。

弹簧跟随1~10 只走/停/眨眼帧
点击表情实拍:爱心图案在鼠标点击处炸开点击特效

点击表情

点一下炸开一簇图案。8 种形状全部由代码画出,支持自定义表情包,GIF 会动起来。

8 种图案自定义 GIF重力/自旋
点击文字实拍:好耶两个字带彩带装饰向上飘走鼠标点击特效

点击文字

点一下弹出文字并向上飘走。多行内容轮换播放,每次随机歪一点,可挂彩带或星光。

多行轮换随机倾斜彩带/星光
窗口水波实拍:移动的窗口像活塞一样推开水面其他特效

窗口水波

把桌面上的窗口当成水面上的活塞:移动时前缘推水、后缘留空腔,静止的窗口零注入。

船首浪船尾迹
点击音效在控制面板「其他设置」页中的位置鼠标点击音效

点击音效

点一下鼠标就响一声,不画任何像素。内置音效 / 单个音效 / 音效文件夹随机三档来源,勾上「键盘点击也触发」后打字也会响。

不画像素三种来源键盘触发
控制面板:分类侧栏与参数滑块控制面板

参数实时可调

侧栏按五类分组,每个参数拖一下立刻生效。调好存成预设,一键切回。

即时生效自定义预设配置持久化
02 / 规格

一个不装 GUI 框架的桌面特效器

13种
特效全屏 / 鼠标 / 点击 / 音效 / 其他,五类
14k 行
Python 源码含 40 个验证脚本
2个
第三方依赖numpy 渲染 + Pillow 抗锯齿
0ms
鼠标拦截WS_EX_TRANSPARENT 完全穿透
10个
内置预设可另存自定义并随时删除
3档
雪花景深远中近,近雪压住远雪
03 / 控制面板

侧栏分组,调参即所见

面板是自绘控件(Canvas + 抗锯齿),所有参数拖动即时生效 —— 不需要重启,也不需要切回桌面去看效果。

下雨页的控制面板,含雨量/速度/长度/风力/浓度滑块与雨丝配色
下雨 · 6 项参数 + 配色
颜料盘页的控制面板,含笔刷/落色/搅动/扩散/晕染/消隐等滑块
颜料盘 · 10 项参数
其他设置页:两个图层各自的层级与多开开关
其他设置 · 图层与多开
04 / 它是怎么做的

几个不太一样的实现

下面每一条都是真的踩过坑之后才写成现在这样的。

透明覆盖层怎么盖住整个虚拟屏

用 WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST 建一个覆盖 SM_CXVIRTUALSCREEN × SM_CYVIRTUALSCREEN 的窗,鼠标事件由 WS_EX_TRANSPARENT 完全穿透。像素走 UpdateLayeredWindow + 预乘 alpha,不需要任何 GUI 框架 —— 所以不装 PyQt / wxPython / WPF,机器上只多 numpy 和 Pillow。

真实水波是真波动方程

高度场 + 速度场双缓冲,g += (avg4(h) − h)·K; g *= damp; h += g。 波会向外传播、相互干涉、撞到屏幕边缘反射 —— 一次点击的涟漪要好几秒才传遍屏幕。 透明层拿不到桌面像素做折射,所以把波面坡度当法线,按固定光向做迎光提亮 / 背光压暗,对任何底色都成立。

窗口水波:把窗口当成水面上的活塞

窗口自己不画一个像素,只往与「真实水波」共用的那片水面注入位移。移动时前缘推水、后缘留空腔; 最小化是水从四周合拢填掉它。静止的窗口绝对零注入 —— 泡着不动的石头不搅水。

流星轨迹不是栅格化线段

而是按间距采样成一串同半径圆盘,一次性向量化盖章。圆盘核内留一段平坦区, 否则相邻圆盘的中点亮度只有一半,彗尾会串成珠子。燃尽距离由屏幕几何决定, 所以超高屏上不会出现「只有上半屏有流星」。

置顶保活:每帧自检,但很便宜

每帧检查是否被第三方置顶窗(全屏视频 / 画中画 / 远控全屏)盖住。 判据要求「可见 且 长宽 ≥ 32px 且类名不在 shell 黑名单」, 再加两道闸门:链签名短路(只读最近 4 个窗口的 hwnd,约 0.7µs)与抢顶限流(两次至少隔 0.1s)。

覆盖层不糊任务栏

把每块屏的任务栏矩形从两层缓冲里擦掉,任务栏于是永远干净 —— 观感上等于任务栏浮在特效之前。任务栏放上/下/左/右都成立,自动隐藏时系统把它挪到屏幕外,矩形自然不相交。

05 / 怎么用

四步,让你的桌面下起雨

01

下载

Releases 里拿打包好的 exe,或 clone 源码自己跑。

02

启动

双击即用。首次运行自动建 venv 并从清华镜像装依赖,之后全程离线。

03

选特效

侧栏按五类分组,点「下雨」就能开。所有参数实时生效,改一下立刻能看到。

04

存预设

调好一套点「保存当前为预设」,随时一键切回。托盘常驻,不挡你干活。

给它一个下雨的桌面

Windows 10 / 11,AGPL-3.0 开源,可自由使用、修改、再分发。

纯 Python · ctypes + numpy · 无 GUI 框架