# 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/kernel32/ole32) ├── systray.go # 系统托盘 + WebView2 壁纸嵌入 + 消息循环 ├── wallpaper.go # 壁纸 HTML 构建 + 主题注入 + 重载 ├── config.go # 配置结构体 + JSON 持久化 ├── settings.go # 设置窗口 (独立 WebView2) ├── weather.go # 天气 API + IP 定位 + 城市列表 ├── horoscope.go # 星座运势 API + 文件缓存 ├── ainews.go # AI 资讯 API + 文件缓存 ├── knowledge.go # 知识卡片 AI 生成 ├── bing.go # Bing 壁纸下载 + 历史导航 + 收藏 ├── dialog.go # Win32 对话框 (文件选择/颜色选择) ├── web/ │ ├── overlay.html # 桌面覆盖层 (时间/天气/星座/资讯/知识) │ ├── settings.html # 设置窗口 UI │ └── themes/ # 壁纸主题 HTML │ ├── aurora.html │ ├── starfield.html │ ├── gradient.html │ ├── particles.html │ ├── fractal.html │ └── text.html ├── config/ # 运行时配置 (settings.json + 缓存) └── docs/ └── wallpaper-embedding.md # 壁纸嵌入技术笔记 ``` ## 架构 ``` ┌──────────────┐ ┌─────────────────┐ │ systray.go │────▶│ WebView2 主窗口 │ SetParent → WorkerW (壁纸层) │ (托盘+消息循环) │ │ overlay.html │ └──────┬───────┘ └─────────────────┘ │ evalJS / SetHtml │ ▼ ┌──────────────┐ ┌─────────────────┐ │ settings.go │────▶│ WebView2 设置窗口 │ 独立窗口, 760x1350 │ │ │ settings.html │ └──────────────┘ └─────────────────┘ ``` **核心通信机制**: - `evalJS(cmd)` — 通过 channel + PostMessage 向壁纸 WebView 注入 JS - `htmlQueue` — 通过 SetHtml 替换整个壁纸 HTML(触发完整重载) - WebView2 `Bind` — 设置窗口通过 Go 绑定函数读写配置 **数据刷新策略**: - 启动时推送文件缓存(即时显示),后台拉取新数据后替换 - 星座: 24h / AI 资讯: 2h / 知识卡片: 30min / 天气: 10min / Bing: 4h ## 配置 配置文件: `config/settings.json`(与 exe 同级目录) | 字段 | 类型 | 默认值 | 说明 | |------|------|--------|------| | 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 | 隐藏知识卡片 | | bingAutoRefresh | bool | false | Bing 每小时自动切换 | | knowledgeKeyword | string | "" | 知识卡片关键字 | | knowledgePrompt | string | "" | 知识卡片提示词 | ## 构建 ```bash go build -o u-desktop.exe . ``` 需要 Windows 10+ 和 WebView2 Runtime(Win11 已内置)。 ## 依赖 ``` github.com/jchv/go-webview2 # WebView2 绑定 github.com/getlantern/systray # 系统托盘 golang.org/x/sys/windows # Win32 API github.com/anthropics/anthropic-sdk-go # Claude API (知识卡片) ``` ## 开机自启 注册表 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run\UDesktopWallpaper` ## 技术要点 - WebView2 嵌入桌面壁纸层通过 `SetParent` 到 WorkerW 实现(详见 [docs/wallpaper-embedding.md](docs/wallpaper-embedding.md)) - 自定义 Win32 消息循环替代 `wv.Run()`(SetParent 后 Run() 消息路由异常) - 全屏应用检测:定时检查前台窗口是否全屏,自动暂停/恢复壁纸渲染 - 配置变更即时生效:设置窗口通过 evalJS 直接操作壁纸层 DOM,无需重启