# 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`
