[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"header-site-profile":3,"article-related-my-demo":14,"article-adjacent-my-demo":45,"article-my-demo":48},{"avatarUrl":4,"signature":5,"musicEnabled":6,"musicTitle":7,"musicArtist":8,"musicUrl":9,"musicCoverUrl":10,"musicPlaylist":11,"musicVolume":13},"\u002Fimages\u002Fwineclouds-avatar.webp","本质哈基米",true,"未命名曲目","Wineclouds","https:\u002F\u002Fmedia.wineclouds.cn\u002Fblog\u002Fprod\u002F2026\u002F07\u002F9f06ede7-e57b-429e-b305-332c14869ca5.mp3","https:\u002F\u002Fmedia.wineclouds.cn\u002Fblog\u002Fprod\u002F2026\u002F07\u002F5b00ffea-7407-496d-94cc-0c91feb7b8bb.png",[12],{"title":7,"artist":8,"url":9,"coverUrl":10},100,[15,27,36],{"id":16,"title":17,"slug":18,"summary":19,"categoryName":20,"categorySlug":21,"pinned":22,"readingMinutes":23,"viewCount":24,"publishedAt":25,"updatedAt":26},4,"用 WSL Dashboard 打造高效的 Linux AI Agent 环境","wsl",null,"碎碎念","0-1",false,9,10,"2026-08-04T14:10:00","2026-09-27T13:53:25.323",{"id":28,"title":29,"slug":30,"summary":31,"categoryName":20,"categorySlug":21,"pinned":22,"readingMinutes":32,"viewCount":33,"publishedAt":34,"updatedAt":35},3,"怎样通过工行星座信用卡（校园版）→ Google Play 订阅 ChatGPT Pro 完整教程","manbo","主播这两天一直在使用 Codex， 但是因为国内政策和 ChatGPT 等相关限制。不能通过直接通过银行卡或者是储蓄卡，包括国内的 visa 卡进行订阅。所以出这一期教程，通过 Google Play 的方式套一层支付来完成 ChatGPT 订阅。",2,57,"2026-07-30T06:37:00","2026-10-02T16:53:01.037",{"id":37,"title":38,"slug":39,"summary":40,"categoryName":20,"categorySlug":21,"pinned":6,"readingMinutes":41,"viewCount":42,"publishedAt":43,"updatedAt":44},1,"Wineclouds04 Website 播客介绍","wineclouds04-website-project-introduction","摘要：Wineclouds04 Website 是一套面向个人创作者的全栈自托管博客与内容运营平台。本文从公开站、管理端、后端架构、数据安全到生产部署，完整介绍这个项目如何把写作、互动与长期运营连接起来。",8,21,"2026-01-06T19:46:00","2026-09-30T22:13:51.179",{"previous":46,"next":47},{"id":37,"title":38,"slug":39,"summary":40,"categoryName":20,"categorySlug":21,"pinned":6,"readingMinutes":41,"viewCount":42,"publishedAt":43,"updatedAt":44},{"id":28,"title":29,"slug":30,"summary":31,"categoryName":20,"categorySlug":21,"pinned":22,"readingMinutes":32,"viewCount":33,"publishedAt":34,"updatedAt":35},{"id":32,"title":49,"slug":50,"summary":51,"contentHtml":52,"categoryName":20,"categorySlug":21,"tags":53,"pinned":6,"allowComment":6,"wordCount":54,"readingMinutes":55,"viewCount":56,"metaTitle":19,"metaDescription":19,"canonicalUrl":19,"publishedAt":57,"updatedAt":58},"Wineclouds Studio多窗口管理器","my-demo","主播最近使用claude code 和 codex时要多开很多窗口，但是频繁的切换使得主播的alt+tab键不堪重负罢工，遂萌生想法制作这个工具可以方便监控多个窗口。","\u003Cdiv>\n \u003Cpre>██╗    ██╗██╗███╗   ██╗███████╗ ██████╗██╗      ██████╗ ██╗   ██╗██████╗ ███████╗\n██║    ██║██║████╗  ██║██╔════╝██╔════╝██║     ██╔═══██╗██║   ██║██╔══██╗██╔════╝\n██║ █╗ ██║██║██╔██╗ ██║█████╗  ██║     ██║     ██║   ██║██║   ██║██║  ██║███████╗\n██║███╗██║██║██║╚██╗██║██╔══╝  ██║     ██║     ██║   ██║██║   ██║██║  ██║╚════██║\n╚███╔███╔╝██║██║ ╚████║███████╗╚██████╗███████╗╚██████╔╝╚██████╔╝██████╔╝███████║\n ╚══╝╚══╝ ╚═╝╚═╝  ╚═══╝╚══════╝ ╚═════╝╚══════╝ ╚═════╝  ╚═════╝ ╚═════╝ ╚══════╝\n                 The Windows workspace for multi-window workflows\n\u003C\u002Fpre>\n \u003Cp>\u003Cstrong>面向 Windows 多窗口工作流的桌面效率工具\u003C\u002Fstrong>\u003C\u002Fp>\n \u003Cp>将本机硬件概览、实时窗口预览、分组热键切换、屏幕区域检测、主题设置与账号入口整合到一套现代桌面应用中。\u003C\u002Fp>\n \u003Cp>\u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-0.1.8-c96b52\" alt=\"Version 0.1.8\">\u003C\u002Fa> \u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F.NET-10.0-512BD4?logo=dotnet&amp;logoColor=white\" alt=\".NET 10\">\u003C\u002Fa> \u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWinUI-3-0078D4?logo=windows&amp;logoColor=white\" alt=\"WinUI 3\">\u003C\u002Fa> \u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWindows_App_SDK-2.2.0-0078D4?logo=windows11&amp;logoColor=white\" alt=\"Windows App SDK 2.2.0\">\u003C\u002Fa> \u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWindows-10_1809%2B-00A4EF?logo=windows&amp;logoColor=white\" alt=\"Windows 10 1809 or later\">\u003C\u002Fa> \u003Ca>\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-22C55E\" alt=\"MIT License\">\u003C\u002Fa>\u003C\u002Fp>\n \u003Cp>\u003Ca>\u003Cstrong>功能概览\u003C\u002Fstrong>\u003C\u002Fa> · \u003Ca>快速使用\u003C\u002Fa> · \u003Ca>开发构建\u003C\u002Fa> · \u003Ca>源码结构\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003Cp>Wineclouds Studio 是一个 WinUI 3 桌面应用，帮助用户在多开客户端、远程会话、构建任务或多显示器工作台中持续关注关键窗口和视觉状态。应用以管理员权限运行，以便稳定访问目标窗口并注册全局热键。\u003C\u002Fp>\n\u003Ch2>0.1.8\u003C\u002Fh2>\n\u003Cp>0.1.8 新增和调整了以下能力：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>首页升级为六项能力概览，覆盖硬件信息、窗口管理、屏幕区域检测、设置中心与账号入口。\u003C\u002Fli>\n \u003Cli>主窗口默认以 \u003Ccode>1440 × 900\u003C\u002Fcode> 居中启动，并在较小工作区中自动收缩。\u003C\u002Fli>\n \u003Cli>主导航改用 Windows 11 Segoe Fluent Icons，明暗主题下保持统一的单色线框风格。\u003C\u002Fli>\n \u003Cli>新增设置中心，可选择“极简白”“极夜黑”或跟随系统，并设置关闭主窗口时直接退出或最小化到系统托盘。\u003C\u002Fli>\n \u003Cli>新增超级调色盘，首批提供极简白与极夜黑两套内置主题，其他配色入口暂时预留。\u003C\u002Fli>\n \u003Cli>新增“关于 Wineclouds”，展示开发者“酒酒的云”、版本、项目与许可证信息。\u003C\u002Fli>\n \u003Cli>新增 ASP.NET Core 10 邮箱账号 API，支持邮箱验证码注册、登录、Token 刷新、当前账号读取、退出和邮箱验证码重置密码；WinUI 客户端使用 Windows Credential Locker 保持登录。\u003C\u002Fli>\n \u003Cli>邮箱推送系统支持 SMTP（MailKit）和腾讯云 SES HTTPS API 双通道，验证码模板变量化发送，带速率限制和重放防护。\u003C\u002Fli>\n \u003Cli>新增会员激活码兑换系统，支持多等级订阅（免费\u002F护卫舰\u002F驱逐舰\u002F巡洋舰）与管理员后台生成激活码。\u003C\u002Fli>\n \u003Cli>调整窗口管理器的进程列表密度，并统一监控和检测模块的启动／停止按钮样式。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>能力概览\u003C\u002Fh2>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>模块\u003C\u002Fth>\n   \u003Cth>能力\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>首页\u003C\u002Ftd>\n   \u003Ctd>居中的 WINECLOUDS 字符 Logo 逐字打印，并集中展示六项工作台能力与当前构建版本。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>硬件信息\u003C\u002Ftd>\n   \u003Ctd>读取本机型号、Windows 版本、运行时间以及 CPU、主板、内存、显卡、显示器、磁盘、声卡和物理网卡信息。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>窗口管理器\u003C\u002Ftd>\n   \u003Ctd>基于 DWM Thumbnail 的实时窗口缩略图、自愈刷新、自动排列与布局保存；支持点击激活、稳定焦点切换、活动窗口隐藏、非活动窗口最小化和分组热键循环。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>屏幕区域检测\u003C\u002Ftd>\n   \u003Ctd>框选虚拟桌面区域，按 HSV 容差、目标像素数、连通面积和确认帧数识别指定颜色；触发后循环播放本地 MP3。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>软件更新\u003C\u002Ftd>\n   \u003Ctd>从 GitHub Releases 检查最新正式版、展示版本说明、下载并校验 NSIS 安装包，然后在当前程序完全退出后启动安装。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>设置中心\u003C\u002Ftd>\n   \u003Ctd>持久化极简白、极夜黑、跟随系统主题和主窗口关闭行为；支持系统托盘恢复与退出。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>超级调色盘\u003C\u002Ftd>\n   \u003Ctd>提供主题实时预览与内置配色选择；当前开放极简白和极夜黑，更多主题预留。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>登录\u003C\u002Ftd>\n   \u003Ctd>邮箱验证码注册、邮箱密码登录、Refresh Token 自动续期、退出和邮箱验证码找回密码已接入账号 API；支持会员激活码兑换与多等级订阅；微信登录继续预留。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>邮箱推送\u003C\u002Ftd>\n   \u003Ctd>双通道验证码邮件发送：SMTP（MailKit，支持 SslOnConnect\u002FStartTls）和腾讯云 SES HTTPS API（模板变量 \u003Ccode>{{code}}\u003C\u002Fcode>、\u003Ccode>{{minutes}}\u003C\u002Fcode>）；含发送冷却、日上限、验证码加盐哈希与防暴力破解重放防护。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>预留模块\u003C\u002Ftd>\n   \u003Ctd>模块 D–E 保留独立页面和导航入口，便于按模块继续扩展。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2>适用场景\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>多开应用：将关键客户端以实时缩略图固定在桌面上，通过点击或热键快速切换。\u003C\u002Fli>\n \u003Cli>设备盘点：快速查看当前电脑的 Windows 版本与主要硬件配置，便于排查和记录。\u003C\u002Fli>\n \u003Cli>状态监看：监测远程桌面、构建任务、下载进度或告警区域的颜色变化。\u003C\u002Fli>\n \u003Cli>多显示器协作：在整个虚拟桌面范围内选择检测区域，持续关注副屏状态。\u003C\u002Fli>\n \u003Cli>个性化工作台：在极简白、极夜黑或系统主题之间切换，并按习惯配置关闭与托盘行为。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>架构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>flowchart TB\n    App[App \u002F MainWindow\\nWinUI 3 导航壳] --&gt; H[首页]\n    App --&gt; I[硬件信息]\n    App --&gt; A[窗口管理器]\n    App --&gt; B[屏幕区域检测]\n    App --&gt; F[软件更新]\n    App --&gt; S[设置中心]\n    App --&gt; U[登录]\n    App --&gt; D[预留模块 D-E]\n\n    H --&gt; H1[逐字符 Logo 动画]\n    I --&gt; I1[WMI 硬件与系统查询]\n    I --&gt; I2[运行时间与手动刷新]\n    A --&gt; A1[DWM Thumbnail]\n    A --&gt; A2[全局热键]\n    A --&gt; A3[窗口配置存储]\n    B --&gt; B1[屏幕捕获]\n    B --&gt; B2[颜色分析与状态机]\n    B --&gt; B3[MP3 循环播放]\n    B --&gt; B4[检测配置存储]\n    F --&gt; F1[GitHub Release 清单]\n    F --&gt; F2[安装包下载与 SHA-256 校验]\n    F --&gt; F3[退出后启动 NSIS]\n    S --&gt; S1[主题与超级调色盘]\n    S --&gt; S2[关闭行为配置]\n    S --&gt; S3[系统托盘]\n    U --&gt; U1[登录／注册／找回密码界面]\n    U --&gt; U2[本地输入校验]\n    App --&gt; L[共享日志]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>核心代码均位于 \u003Ccode>src\u002FWinecloudsStudio\u003C\u002Fcode>：页面负责交互与生命周期，服务层封装 Windows API 和业务能力，\u003Ccode>Core\u003C\u002Fcode> 保持屏幕颜色分析与状态机的独立性，\u003Ccode>Shared\u002FLogging\u003C\u002Fcode> 提供全局日志能力。\u003C\u002Fp>\n\u003Ch2>快速使用\u003C\u002Fh2>\n\u003Ch3>硬件信息\u003C\u002Fh3>\n\u003Col>\n \u003Cli>打开“硬件信息”，应用会在后台读取本机 Windows 与主要硬件配置。\u003C\u002Fli>\n \u003Cli>顶部卡片显示机型、系统版本和实时运行时间，下方清单展示各类设备详情。\u003C\u002Fli>\n \u003Cli>硬件发生变化或需要重新查询时，点击“刷新信息”。\u003C\u002Fli>\n \u003Cli>页面只读取本机信息，不修改 BIOS、驱动、注册表或硬件配置。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>窗口管理器\u003C\u002Fh3>\n\u003Col>\n \u003Cli>在“窗口管理器”中刷新并选择要关注的窗口。\u003C\u002Fli>\n \u003Cli>设置缩略图尺寸、透明度、置顶、标题、边框、位置锁定与网格吸附；这些显示设置可在监控期间动态调整。\u003C\u002Fli>\n \u003Cli>创建窗口分组并配置前进、后退热键。\u003C\u002Fli>\n \u003Cli>按需启用“隐藏当前活动窗口的缩略图”或“切换后最小化上一个窗口”。\u003C\u002Fli>\n \u003Cli>开始监控；可点击缩略图激活窗口，或用分组热键循环切换。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>屏幕区域检测\u003C\u002Fh3>\n\u003Col>\n \u003Cli>打开“屏幕区域检测”，框选需要监控的区域。\u003C\u002Fli>\n \u003Cli>选择或拾取目标颜色，并设置容差、最少目标像素、最小连通面积与确认帧数。\u003C\u002Fli>\n \u003Cli>选择本地 MP3 文件作为提醒声音。\u003C\u002Fli>\n \u003Cli>开始检测；目标颜色稳定出现时循环提醒，稳定消失后自动停止并重新布防。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>软件更新\u003C\u002Fh3>\n\u003Col>\n \u003Cli>打开“软件更新”，程序会自动检查 GitHub 上的最新正式 Release。\u003C\u002Fli>\n \u003Cli>有新版本时查看版本说明和安装包信息，然后点击“下载并安装”。\u003C\u002Fli>\n \u003Cli>程序会把安装包写入受保护的 \u003Ccode>ProgramData\u003C\u002Fcode> 暂存目录，并同时校验 \u003Ccode>update.json\u003C\u002Fcode> 中的 SHA-256；主程序退出后，辅助进程还会复核路径、ACL、摘要、Authenticode 有效性及构建时固定的发布证书。\u003C\u002Fli>\n \u003Cli>Release 标签、项目版本和安装包文件名必须使用相同版本，例如 \u003Ccode>v0.1.8\u003C\u002Fcode>、\u003Ccode>0.1.8\u003C\u002Fcode> 和 \u003Ccode>WinecloudsStudio-Setup-0.1.8-win-x64.exe\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>设置、主题与托盘\u003C\u002Fh3>\n\u003Col>\n \u003Cli>打开“设置”，在“外观与行为”中选择极简白、极夜黑或跟随 Windows 系统主题。\u003C\u002Fli>\n \u003Cli>在“超级调色盘”中查看实时主题预览，并选择当前开放的内置配色。\u003C\u002Fli>\n \u003Cli>选择关闭主窗口时“直接退出应用”或“最小化到系统托盘”。\u003C\u002Fli>\n \u003Cli>启用托盘模式后，可双击托盘图标恢复窗口，或通过右键菜单退出。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Wineclouds 账号\u003C\u002Fh3>\n\u003Cp>Wineclouds Studio 内置完整的邮箱账号系统，由 ASP.NET Core Identity 提供后端支持。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>账号功能概览：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>功能\u003C\u002Fth>\n   \u003Cth>说明\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>邮箱注册\u003C\u002Ftd>\n   \u003Ctd>发送 6 位验证码到邮箱，验证后创建账号并自动登录\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>邮箱登录\u003C\u002Ftd>\n   \u003Ctd>邮箱 + 密码登录，返回 Access Token（15 分钟）和 Refresh Token（30 天）\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>自动续期\u003C\u002Ftd>\n   \u003Ctd>Refresh Token 保存在 Windows Credential Locker，启动时自动恢复登录状态\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>找回密码\u003C\u002Ftd>\n   \u003Ctd>邮箱验证码重置密码，重置后跳回登录页\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>退出登录\u003C\u002Ftd>\n   \u003Ctd>远程通知服务器作废 Token，本地清除凭据\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>会员兑换\u003C\u002Ftd>\n   \u003Ctd>输入激活码升级会员等级（免费 → 护卫舰 → 驱逐舰 → 巡洋舰）\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>邮箱推送系统：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>项目提供双通道验证码邮件发送方案：\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>通道\u003C\u002Fth>\n   \u003Cth>适用场景\u003C\u002Fth>\n   \u003Cth>说明\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>腾讯云 SES API\u003C\u002Ftd>\n   \u003Ctd>生产环境（推荐）\u003C\u002Ftd>\n   \u003Ctd>通过 HTTPS 443 调用腾讯云 SES \u003Ccode>SendEmail\u003C\u002Fcode> API，使用已审核的模板发送；无需 SMTP 权限，不受云服务器 TCP 25 封禁影响\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>SMTP（MailKit）\u003C\u002Ftd>\n   \u003Ctd>备用\u002F自建服务器\u003C\u002Ftd>\n   \u003Ctd>支持 \u003Ccode>SslOnConnect\u003C\u002Fcode>（465）和 \u003Ccode>StartTls\u003C\u002Fcode>（587）两种加密模式\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>验证码安全策略：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>策略\u003C\u002Fth>\n   \u003Cth>参数\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>验证码有效期\u003C\u002Ftd>\n   \u003Ctd>5 分钟\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>重复发送冷却\u003C\u002Ftd>\n   \u003Ctd>同一邮箱 60 秒内不可重发\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>每日发送上限\u003C\u002Ftd>\n   \u003Ctd>每邮箱每天最多 10 次\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>防暴力破解\u003C\u002Ftd>\n   \u003Ctd>连续输错 5 次后该验证码失效\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>验证码存储\u003C\u002Ftd>\n   \u003Ctd>只保存加盐哈希，不保存明文\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>Pepper 加盐\u003C\u002Ftd>\n   \u003Ctd>通过 \u003Ccode>EmailVerification__Pepper\u003C\u002Fcode> 配置服务端 Pepper 密钥\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>邮件模板：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>注册验证码和密码重置验证码的腾讯云 SES 模板分别位于：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Ccode>docs\u002Femail-templates\u002Ftencent-ses-registration-code.html\u003C\u002Fcode>\u003C\u002Fli>\n \u003Cli>\u003Ccode>docs\u002Femail-templates\u002Ftencent-ses-password-reset-code.html\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>模板变量为 \u003Ccode>{{code}}\u003C\u002Fcode>（验证码）和 \u003Ccode>{{minutes}}\u003C\u002Fcode>（有效期分钟数）。\u003C\u002Fp>\n\u003Cp>Ubuntu + Docker 的完整生产部署步骤见 \u003Ca>\u003Ccode>deploy\u002Fubuntu-docker\u002FREADME.md\u003C\u002Fcode>\u003C\u002Fa>。该方案使用 \u003Ccode>api.wineclouds.cn\u003C\u002Fcode>、PostgreSQL、Docker Secret 和宿主机 Nginx，不改变现有 \u003Ccode>wineclouds.cn\u003C\u002Fcode> 网站。\u003C\u002Fp>\n\u003Col>\n \u003Cli>当前生产方案使用腾讯云 SES HTTPS API。先创建并审核注册验证码模板，然后通过服务器 Secret 配置以下值；不要把 \u003Ccode>SecretKey\u003C\u002Fcode> 提交到仓库：\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode>$env:Email__Provider = “TencentSesApi”\n$env:Email__TencentSes__Region = “ap-guangzhou”\n$env:Email__TencentSes__SecretId = “CAM 子用户 SecretId”\n$env:Email__TencentSes__SecretKey = “CAM 子用户 SecretKey”\n$env:Email__TencentSes__FromAddress = “verify@notify.wineclouds.cn”\n$env:Email__TencentSes__FromName = “Wineclouds”\n$env:Email__TencentSes__RegistrationTemplateId = “55394”\n$env:Email__TencentSes__PasswordResetTemplateId = “密码重置模板 ID”\n$env:EmailVerification__Pepper = “replace-with-a-long-random-server-secret”\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>可上传到腾讯云的注册和密码重置模板变量均为 \u003Ccode>{{code}}\u003C\u002Fcode> 和 \u003Ccode>{{minutes}}\u003C\u002Fcode>。个人实名认证用户通过 API 的 HTTPS 443 发信，不需要 SMTP 权限，也不受云服务器 TCP 25 封禁影响。\u003C\u002Fp>\n\u003Cp>企业账号或已有 SMTP 权限时，也可以将提供程序切换为 \u003Ccode>Smtp\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$env:Email__Provider = “Smtp”\n$env:Email__Smtp__Host = “gz-smtp.qcloudmail.com” # 广州区\n$env:Email__Smtp__Port = “465”                    # 隐式 TLS\n$env:Email__Smtp__SecurityMode = “SslOnConnect”\n$env:Email__Smtp__UserName = “verify@account.example.com”\n$env:Email__Smtp__Password = “控制台生成的 SMTP 密码”\n$env:Email__Smtp__FromAddress = “verify@account.example.com”\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>腾讯云还提供香港区 \u003Ccode>smtp.qcloudmail.com\u003C\u002Fcode> 和国际站 \u003Ccode>sg-smtp.qcloudmail.com\u003C\u002Fcode>。根据腾讯云 2026 年产品公告，2026 年 3 月 2 日后新开通邮件推送的个人实名认证用户不再提供 SMTP 发信权限，此类账号应改用腾讯云 SES HTTPS API，或升级企业认证。参见\u003Ca href=\"https:\u002F\u002Fcloud.tencent.com\u002Fdocument\u002Fproduct\u002F1288\u002F65750\" rel=\"noopener noreferrer nofollow\">腾讯云 SMTP 服务地址\u003C\u002Fa>和\u003Ca href=\"https:\u002F\u002Fcloud.tencent.com\u002Fdocument\u002Fproduct\u002F1288\u002F54785\" rel=\"noopener noreferrer nofollow\">邮件推送产品动态\u003C\u002Fa>。\u003C\u002Fp>\n\u003Cp>腾讯云 CVM 默认封禁对外 TCP 25 不影响 SMTP 备用配置：API 服务器只会主动连接腾讯云 SES 的 465 端口，不监听或使用 25 端口。若服务商要求 587，则把 \u003Ccode>Port\u003C\u002Fcode> 改为 \u003Ccode>587\u003C\u002Fcode>，同时把 \u003Ccode>SecurityMode\u003C\u002Fcode> 改为 \u003Ccode>StartTls\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>会员激活码系统：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>管理员可通过 \u003Ccode>tools\u002FGenerateMembershipCode.ps1\u003C\u002Fcode> 生成激活码，指定套餐等级和有效期：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>$headers = @{ “Authorization” = “Bearer $adminAccessToken”; “Content-Type” = “application\u002Fjson” }\n$body = @{ planId = “frigate”; durationDays = 365; maxRedemptions = 1; note = “年度会员” } | ConvertTo-Json\nInvoke-RestMethod -Method Post -Uri “https:\u002F\u002Fapi.wineclouds.cn\u002Fv1\u002Fadmin\u002Fcodes” -Headers $headers -Body $body\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>用户在客户端”登录”页面登录后，输入激活码即可兑换升级。\u003C\u002Fp>\n\u003Col start=\"2\">\n \u003Cli>在同一个 PowerShell 窗口启动账号 API：\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode>dotnet run --project .\\src\\WinecloudsStudio.Api\\WinecloudsStudio.Api.csproj --launch-profile http\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col start=\"3\">\n \u003Cli>启动 Wineclouds Studio，打开”登录 → 注册”，填写邮箱并发送验证码。输入邮件中的 6 位验证码，以及至少 8 位、包含小写字母与数字的密码。\u003C\u002Fli>\n \u003Cli>验证码 5 分钟有效，同一邮箱 60 秒内不能重复发送、每天最多发送 10 次，连续输错 5 次后失效。\u003C\u002Fli>\n \u003Cli>注册成功后会自动登录；Refresh Token 保存在 Windows Credential Locker，重新启动客户端时会自动恢复账号。\u003C\u002Fli>\n \u003Cli>默认账号 API 地址为 \u003Ccode>https:\u002F\u002Fapi.wineclouds.cn\u002F\u003C\u002Fcode>。本地开发时可通过 \u003Ccode>WINECLOUDS_ACCOUNT_API_URL=http:\u002F\u002F127.0.0.1:5047\u002F\u003C\u002Fcode> 环境变量覆盖。\u003C\u002Fli>\n \u003Cli>找回密码使用单独的六位验证码和腾讯 SES 模板；重置成功后回到登录页使用新密码。微信登录尚未开放。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>运行要求\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>Windows 10 1809（17763）或更高版本，64 位系统。\u003C\u002Fli>\n \u003Cli>应用启动时会请求管理员权限；若取消 UAC 提示，应用将退出。\u003C\u002Fli>\n \u003Cli>使用窗口管理功能时，目标应用也应以可访问的同等或更低权限运行。\u003C\u002Fli>\n \u003Cli>声音提醒仅支持本地 MP3 文件。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>从源码构建\u003C\u002Fh2>\n\u003Cp>开发环境：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>.NET 10 SDK\u003C\u002Fli>\n \u003Cli>Windows App SDK（通过 NuGet 还原）\u003C\u002Fli>\n \u003Cli>NSIS 3.x（仅创建安装包时需要）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode>dotnet restore .\\WinecloudsStudio.slnx\ndotnet build .\\WinecloudsStudio.slnx --configuration Release --property:Platform=x64\ndotnet run --project .\\src\\WinecloudsStudio\\WinecloudsStudio.csproj\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>创建自包含的 x64 安装包：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>.\\scripts\\New-Installer.ps1 -Configuration Release\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>安装包输出到 \u003Ccode>artifacts\\installer\\output\\\u003C\u002Fcode>，发布载荷输出到 \u003Ccode>artifacts\\installer\\publish-win-x64\\\u003C\u002Fcode>。两者都是可再生产物，不应提交到版本库。\u003C\u002Fp>\n\u003Ch2>发布更新版本\u003C\u002Fh2>\n\u003Cp>仓库包含 \u003Ccode>.github\u002Fworkflows\u002Frelease.yml\u003C\u002Fcode>。发布正式更新时：\u003C\u002Fp>\n\u003Col>\n \u003Cli>创建带必需审核人的 GitHub Environment \u003Ccode>release-signing\u003C\u002Fcode>，在其中配置 \u003Ccode>WINDOWS_SIGNING_CERTIFICATE_BASE64\u003C\u002Fcode>（受信任代码签名 PFX 的 Base64）和 \u003Ccode>WINDOWS_SIGNING_CERTIFICATE_PASSWORD\u003C\u002Fcode>；再设置 Repository Variable \u003Ccode>UPDATE_SIGNER_CERTIFICATE_SHA256\u003C\u002Fcode> 为叶证书 DER 的 SHA-256 指纹。构建与签名在不同 runner\u002Fjob 中完成，签名 job 会核对 PFX 与固定指纹，缺少或不一致时安全失败。证书轮换时，可暂时设置 \u003Ccode>NEXT_UPDATE_SIGNER_CERTIFICATE_SHA256\u003C\u002Fcode>，让过渡版本同时固定当前和下一张证书。\u003C\u002Fli>\n \u003Cli>修改 \u003Ccode>src\u002FWinecloudsStudio\u002FWinecloudsStudio.csproj\u003C\u002Fcode> 中的 \u003Ccode>Version\u003C\u002Fcode>。\u003C\u002Fli>\n \u003Cli>提交并推送代码，确认 \u003Ccode>main\u003C\u002Fcode> 构建正常。\u003C\u002Fli>\n \u003Cli>创建与项目版本完全一致的标签，例如：\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode>git tag v0.1.8\ngit push origin v0.1.8\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>标签推送后，GitHub Actions 会自动：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>配置 .NET 10 和 NSIS。\u003C\u002Fli>\n \u003Cli>生成 Windows x64 自包含安装器。\u003C\u002Fli>\n \u003Cli>使用 SHA-256 和 RFC 3161 时间戳签署安装器，并验证 Authenticode 信任链与签名证书。\u003C\u002Fli>\n \u003Cli>生成对应的 \u003Ccode>.sha256\u003C\u002Fcode> 校验文件。\u003C\u002Fli>\n \u003Cli>创建 GitHub Release，或覆盖同一标签下的旧安装包资产。\u003C\u002Fli>\n \u003Cli>生成并上传包含版本、下载地址、文件大小和 SHA-256 的 \u003Ccode>update.json\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>软件更新模块通过 \u003Ccode>releases\u002Flatest\u002Fdownload\u002Fupdate.json\u003C\u002Fcode> 获取最新正式版，不消耗 GitHub REST API 配额。清单中的 Release 标签、项目版本、安装包文件名和 SHA-256 必须相互一致；即使 GitHub Release 中的安装包与摘要同时被替换，客户端也会因为 Authenticode 证书指纹不匹配而拒绝执行。签名证书轮换前，应先用旧证书发布一个同时信任新证书的过渡版本。\u003C\u002Fp>\n\u003Ch2>项目结构\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>WinecloudsStudio.slnx\n├── src\u002FWinecloudsStudio\u002F\n│   ├── App.xaml(.cs)                 # 应用启动、提权与关闭生命周期\n│   ├── MainWindow.xaml(.cs)          # 导航壳与模块页面缓存\n│   ├── Assets\u002F                       # 应用图标和资源\n│   ├── Modules\u002F\n│   │   ├── Home\u002F                     # 逐字符 Logo 与工作流概览首页\n│   │   ├── SystemInformation\u002F        # WMI 硬件读取、运行时间与信息页面\n│   │   ├── WindowManager\u002F            # 缩略图、热键、窗口配置与 Windows API 互操作\n│   │   ├── ScreenDetection\u002F          # 捕获、颜色识别、状态机、提醒与配置\n│   │   ├── Settings\u002F                 # 主题、调色盘、托盘关闭行为与关于页面\n│   │   ├── Login\u002F                    # 账号交互界面与本地输入校验\n│   │   ├── Reserved\u002F                 # 软件更新及预留模块 D-E\n│   │   └── Navigation\u002F               # 未实现模块的兜底页面\n│   └── Shared\u002FLogging\u002F               # 异步文件日志\n├── src\u002FWinecloudsStudio.Api\u002F         # ASP.NET Core Identity 邮箱账号 API\n│   ├── Services\u002F                      # EmailRegistrationService、PasswordResetService、\n│   │                                  # SmtpEmailSender、TencentSesRegistrationEmailSender\n│   └── Models\u002F                        # ApplicationUser、MembershipPlan、MembershipSubscription\n├── docs\u002F                              # 账号、会员与邮箱模板技术文档\n├── installer\u002F                        # NSIS 安装器定义\n├── scripts\u002FNew-Installer.ps1         # 发布与打包脚本\n└── README.md\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>配置、日志与故障排查\u003C\u002Fh2>\n\u003Cp>应用数据位于 \u003Ccode>%LOCALAPPDATA%\\WinecloudsStudio\\\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>文件\u003C\u002Fth>\n   \u003Cth>用途\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>window_manager_config.json\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>窗口管理器的缩略图、分组与显示配置。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>screen-region-detector.json\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>屏幕区域检测参数与声音文件路径。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>application-settings.json\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>全局主题和主窗口关闭行为。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>\u003Ccode>logs\\wineclouds_yyyyMMdd.log\u003C\u002Fcode>\u003C\u002Ftd>\n   \u003Ctd>按天滚动的运行日志。\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>开发账号数据库位于 \u003Ccode>%LOCALAPPDATA%\\WinecloudsStudio\\AccountServer\\accounts.db\u003C\u002Fcode>。验证码只保存加盐哈希，不保存明文。SQLite 只用于本地开发；Ubuntu + Docker 生产部署使用独立 PostgreSQL 数据库。\u003C\u002Fp>\n\u003Cp>日志对未处理异常和未观察任务异常进行记录；错误级别消息会立即落盘，普通消息由后台线程批量刷新。日志默认保留最近 7 天，适合在启动失败、热键注册失败、窗口操作失败或检测异常时提供排查依据。\u003C\u002Fp>\n\u003Cp>常见问题：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cstrong>无法激活目标窗口\u003C\u002Fstrong>：确认 Wineclouds Studio 已以管理员权限运行，并检查目标窗口未被更高权限进程保护。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>热键无法注册\u003C\u002Fstrong>：该组合键可能已被其他程序占用；更换为未占用的键位后重试。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>颜色检测误报\u003C\u002Fstrong>：提高最少目标像素数或最小连通面积，适当收紧颜色容差，并增加确认帧数。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>没有声音提醒\u003C\u002Fstrong>：确认选择的是可读取的本地 MP3 文件，且 Windows 当前音频输出可用。\u003C\u002Fli>\n \u003Cli>\u003Cstrong>关闭窗口后程序仍在运行\u003C\u002Fstrong>：在设置中选择了“最小化到系统托盘”；可从托盘菜单退出，或改回“直接退出应用”。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>发布约定\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>仅提交源码、构建脚本、安装器定义和必要的资源文件。\u003C\u002Fli>\n \u003Cli>\u003Ccode>bin\u002F\u003C\u002Fcode>、\u003Ccode>obj\u002F\u003C\u002Fcode>、\u003Ccode>.vs\u002F\u003C\u002Fcode>、\u003Ccode>artifacts\u002F\u003C\u002Fcode> 等构建缓存和发布产物必须忽略。\u003C\u002Fli>\n \u003Cli>配置、日志、密钥和其他敏感本地文件不得提交；若确有必要，应提供脱敏的 \u003Ccode>.example\u003C\u002Fcode> 示例文件。\u003C\u002Fli>\n \u003Cli>安装包使用 LZMA 固实压缩，并以自包含方式发布，避免依赖用户机器上的共享运行时。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>许可证\u003C\u002Fh2>\n\u003Cp>\u003Ca>MIT License\u003C\u002Fa>\u003C\u002Fp>",[],4605,16,14,"2026-07-29T08:00:00","2026-09-28T05:34:29.492"]