u-desktop
Windows 桌面壁纸增强工具 — 将 WebView2 嵌入桌面壁纸层,在壁纸上叠加时间、天气、星座运势、AI 资讯、电子相册等信息卡片。
功能
| 模块 | 说明 |
|---|---|
| 壁纸 | 6 种主题动画(极光/星空/渐变/粒子/极光流体/文字)、本地图片、Bing 每日壁纸(导航+收藏)、纯色/渐变 |
| 时间 | 大字时钟,支持秒显示开关,整点光晕动画,节日倒计时 |
| 天气 | 和风天气 API,当前天气 + 24h/7d 预报,IP 自动定位 + 手动选城 |
| 星座运势 | 天聚数行 API,5 维指数进度条 + 幸运标签 + 今日概述 |
| AI 资讯 | 天聚数行 API,图文布局 5 条展示 |
| 知识卡片 | AI 生成,自定义关键字 + 提示词 |
| 电子相册 | 本地目录轮播,可调间隔,支持电子相册模式(照片铺满壁纸) |
| 桌面设置 | 独立 WebView2 窗口,所有配置可视化操作 |
项目结构
u-desktop/
├── main.go # 入口: 单实例互斥锁 + 配置目录 + 托盘启动
├── win32.go # Win32 API 声明 (user32/comdlg32/shell32)
├── systray.go # 系统托盘 + WebView2 壁纸嵌入 + 消息循环 + WorkerW 监控
├── wallpaper.go # 壁纸 HTML 构建 + 主题注入 + 重载
├── config.go # 配置结构体 + JSON 持久化
├── settings.go # 设置窗口 (独立 WebView2)
├── weather.go # 天气 API + IP 定位 + 城市列表
├── horoscope.go # 星座运势 API + 文件缓存
├── ainews.go # AI 资讯 API + 文件缓存
├── knowledge.go # 知识卡片 AI 生成 + SQLite 缓存
├── bing.go # Bing 壁纸下载 + 历史导航 + 收藏
├── photo.go # 电子相册: 目录扫描 + 定时轮播 + 预缓存
├── dialog.go # Win32 对话框 (文件选择/颜色选择/目录选择)
├── web-ui/ # Vue 3 前端源码
│ └── src/
│ ├── overlay/ # 桌面覆盖层组件 (TimeCard/WeatherCard/ZodiacCard/...)
│ ├── settings/ # 设置窗口组件 (ToggleSection/WallpaperSection/...)
│ └── shared/ # 类型定义 + 工具函数
├── web/
│ ├── overlay.html # 构建产物: 桌面覆盖层 (单文件内联)
│ ├── settings.html # 构建产物: 设置窗口 UI
│ └── themes/ # 壁纸主题 HTML
│ ├── aurora.html # WebGL 极光动画
│ ├── starfield.html # Canvas 2D 星空
│ ├── gradient.html # CSS 渐变动画
│ ├── particles.html # Canvas 2D 粒子
│ ├── fractal.html # WebGL 分形流体
│ └── text.html # CSS 文字动画
└── docs/
└── wallpaper-embedding.md # 壁纸嵌入技术笔记
架构
┌──────────────┐ ┌─────────────────┐
│ systray.go │────▶│ WebView2 主窗口 │ SetParent → WorkerW (壁纸层)
│ (托盘+消息循环) │ │ overlay.html │ WS_EX_TRANSPARENT (鼠标穿透)
└──────┬───────┘ └─────────────────┘
│ evalJS / SetHtml / PostMessage
│
▼
┌──────────────┐ ┌─────────────────┐
│ settings.go │────▶│ WebView2 设置窗口 │ 独立窗口, 自适应高度
│ │ │ settings.html │
└──────────────┘ └─────────────────┘
核心通信机制:
evalJS(cmd)— 通过 channel + PostMessage 向壁纸 WebView 注入 JShtmlQueue— 通过 SetHtml 替换整个壁纸 HTML(主题切换时触发)- WebView2
Bind— 设置窗口通过 Go 绑定函数(30+)读写配置 TrayClickCh— 托盘图标左键点击通道,触发设置窗口打开
数据刷新策略:
- 启动时推送文件缓存(即时显示),后台拉取新数据后替换
- 星座: 24h / AI 资讯: 2h / 知识卡片: 30min / 天气: 10min / Bing: 4h
WorkerW 监控:
- 每 10 秒检测 WebView2 父窗口是否变化(
GetParent) - Windows 桌面重建 WorkerW 时自动重新嵌入,无感知恢复
配置
配置文件: ~/.u-desktop/settings.json
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| layout | string | "single" | 布局: single(合并卡片) / multi(独立卡片) |
| wallpaperType | string | "theme" | 壁纸类型: theme/image/bing/color |
| theme | string | "aurora" | 主题动画 |
| zodiac | string | "射手座" | 星座 |
| city | string | "" | 天气城市 ID |
| showSeconds | bool | false | 显示秒 |
| hideWallpaper | bool | false | 隐藏壁纸 |
| hideTime | bool | false | 隐藏时间 |
| hideWeather | bool | false | 隐藏天气 |
| hideZodiac | bool | false | 隐藏星座 |
| hideAINews | bool | false | 隐藏 AI 资讯 |
| hideKnowledge | bool | false | 隐藏知识卡片 |
| hidePhoto | bool | false | 隐藏相册 |
| photoFrameMode | bool | false | 电子相册模式(照片铺满壁纸) |
| photoDir | string | "" | 相册图片目录 |
| photoInterval | int | 15 | 相册切换间隔(秒) |
| bingAutoRefresh | bool | false | Bing 定时自动切换 |
| knowledgeKeyword | string | "" | 知识卡片关键字 |
| knowledgePrompt | string | "" | 知识卡片提示词 |
| wallpaperText | string | "" | 文字主题自定义内容 |
| savedColors | array | [] | 收藏的颜色方案 |
| autoStart | bool | false | 开机自启 |
| color1 | string | "#1a1a2e" | 纯色/渐变颜色 1 |
| color2 | string | "" | 渐变颜色 2 |
| colorGradient | bool | false | 启用渐变 |
构建
# 完整构建(含前端 + UPX 压缩)
pwsh -File build.ps1
# 构建并打包 zip(含 WebView2 bootstrapper)
pwsh -File build.ps1 -Pack
需要 Windows 10+ 和 WebView2 Runtime(Win11 已内置)。
交互
| 操作 | 行为 |
|---|---|
| 左键托盘图标 | 打开桌面设置 |
| 右键托盘图标 | 弹出菜单(桌面设置/重启/退出) |
| 设置窗口 | 所有配置实时生效,无需重启 |
依赖
Go:
github.com/jchv/go-webview2— WebView2 绑定github.com/getlantern/systray— 系统托盘(已修改:左键点击支持)golang.org/x/sys/windows— Win32 APImodernc.org/sqlite— 纯 Go SQLite(知识卡片缓存)
前端:
- Vue 3.5 + TypeScript 5.8 + Vite 6 + Tailwind CSS 3
vite-plugin-singlefile— 构建产物单文件内联
技术要点
- WebView2 嵌入桌面壁纸层通过
SetParent到 WorkerW 实现(详见 docs/wallpaper-embedding.md) WS_EX_TRANSPARENT | WS_EX_LAYERED扩展样式实现鼠标键盘事件穿透,桌面图标正常操作- 自定义 Win32 消息循环替代
wv.Run()(SetParent 后 Run() 消息路由异常) - WorkerW 重建监控:定时
GetParent检测,Windows 桌面刷新后自动重新嵌入 - 全屏应用检测:定时检查前台窗口是否全屏,自动暂停/恢复壁纸渲染
- 配置存储于
~/.u-desktop/,不依赖 exe 同级目录,构建清理不影响用户配置 - 配置变更即时生效:设置窗口通过 evalJS 直接操作壁纸层 DOM,无需重启
- 构建参数
-H windowsgui隐藏控制台窗口,双击 exe 无黑窗口
开机自启
注册表 HKCU\Software\Microsoft\Windows\CurrentVersion\Run\u-desktop
Description
Languages
HTML
58.1%
Go
24.7%
Vue
11.9%
TypeScript
2.7%
CSS
1%
Other
1.5%