Files
u-desktop/README.md
绝尘 cd7247d880 新增: 功能路线图 + 9份需求契约
- feature-roadmap.md: 现有能力盘点 + P1/P2/P3方向 + 竞品参考
- AI深度视差: 远程推理方案(服务端Depth-Anything + 客户端WebGL)
- 自动升级模块文档: 设计规格/任务规划/决策记录
- 9份需求契约: 视频/颜色提取/时间段/番茄钟/播放列表/电池/网页/便签/监控
2026-05-28 19:06:39 +08:00

162 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 | 启用渐变 |
## 构建
```powershell
# 完整构建(含前端 + 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](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`