u-desktop

Windows 桌面壁纸增强工具 — 将 WebView2 嵌入桌面壁纸层在壁纸上叠加时间、天气、星座运势、AI 资讯、电子相册等信息卡片。

功能

模块 说明
壁纸 6 种主题动画(极光/星空/渐变/粒子/极光流体/文字、本地图片、Bing 每日壁纸(导航+收藏)、纯色/渐变
时间 大字时钟,支持秒显示开关,整点光晕动画,节日倒计时
天气 和风天气 API当前天气 + 24h/7d 预报IP 自动定位 + 手动选城
星座运势 天聚数行 API5 维指数进度条 + 幸运标签 + 今日概述
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 注入 JS
  • htmlQueue — 通过 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 RuntimeWin11 已内置)。

交互

操作 行为
左键托盘图标 打开桌面设置
右键托盘图标 弹出菜单(桌面设置/重启/退出)
设置窗口 所有配置实时生效,无需重启

依赖

Go:

  • github.com/jchv/go-webview2 — WebView2 绑定
  • github.com/getlantern/systray — 系统托盘(已修改:左键点击支持)
  • golang.org/x/sys/windows — Win32 API
  • modernc.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
No description provided
Readme 2.4 MiB
Languages
HTML 58.1%
Go 24.7%
Vue 11.9%
TypeScript 2.7%
CSS 1%
Other 1.5%