# 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 注入 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 | 启用渐变 | ## 构建 ```powershell # 完整构建(含前端 + 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 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](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`