把 Windows 通知带进 VR。
简体中文 | English
把 Windows 系统通知转发到 XSOverlay 的中文托盘程序。QQ、微信等聊天通知默认展开显示发送人和正文;普通提醒默认显示小通知。
界面目前为简体中文,使用与技术文档提供中英双语。
从 GitHub Releases 下载 Notify2Xso-1.2.1-win11-x64.zip 并解压,面向 Windows 11 x64,包含 .NET 运行时。源码构建的安装文件位于 dist/Notify2Xso-win-x64/。
最新版本 1.2.1:示例姓名修正为 LinYe,邀请文案改为“今晚玩vrc吗”。保留联系人 / 群聊头像同步、本地头像预览和扁平化软件图标。已有旧版时,先从托盘退出,再运行新版安装目录中的 Install.cmd 进行更新。
- 双击该目录中的 Install.cmd 安装程序。当前提供未签名的 MSIX 安装包,Windows 会要求管理员确认。请使用当前 Windows 帐户确认 UAC。安装器不导入证书、不打开开发者模式;首次安装不开启开机启动。
- 从开始菜单打开 Notify2XSO,或双击 Launch.cmd。
- 启动 SteamVR、XSOverlay;在适配器中点击 开始转发,允许 Windows 通知访问。
- 点击 测试大通知 / 测试小通知,在 VR 中检查文字和新版软件图标。这一步验证 XSO 接口,不依赖系统通知权限。
- 在「使用帮助」点击 发送 Windows 测试通知,或运行 Test-Toast.cmd,验证系统通知采集。最后让 QQ 收到一条新的系统通知。
- Windows 通知中心已有聊天通知时,可点击概览中的 预览通知头像。它只预览最近最多 6 条按应用规则允许的现有通知,不发送给 XSO,也不改变正常转发的基线;需已授予通知访问权限。
关闭窗口会收起到系统托盘;右键托盘可以暂停、恢复、打开窗口或退出。开机启动可在设置中手动开启。首次授权后,下次启动会自动开始转发。
| 通知来源 | 默认行为 |
|---|---|
| QQ、微信、Discord、Telegram、Slack、Teams、Signal、钉钉、飞书 | 大卡片,应用名 + 通知标题 / 发送人,下面显示正文 |
| Outlook、邮件、Thunderbird | 大卡片,显示标题和正文 |
| 普通 Windows 提醒、其他应用 | 小卡片,仅显示标题;标题为空时使用正文摘要 |
| VRCX | 屏蔽其系统通知,避免与 VRCX 自带的 XSO 通知重复 |
「应用规则」可以强制设置 自动 / 大通知 / 小通知 / 屏蔽。匹配应用名称或应用 ID,不区分大小写;* 表示任意字符,? 表示一个字符。第一条匹配规则生效,可以上下移动优先级。比如 *QQ* → 大通知、*浏览器* → 小通知,最后添加 * → 屏蔽 可以仅放行前面的指定应用。
聊天标题与正文按 Windows 提供的字段保留,不猜测发送人,也不把群消息中的冒号强行拆成姓名。通知不包含发送人时,程序无法补出。头像优先使用这条通知自带的联系人或群聊图片,不猜测群消息应对应哪位成员。特别长的消息会按可视行数截断并加省略号。
大小通知都支持携带 PNG 图像;最近活动中的图标预览与发送给 XSO 的图像一致。「图标」列会标明通知头像、应用图标、备用图标或默认图标。设置中的 同步联系人 / 群聊头像 默认开启,可以单独关闭。
- 优先读取通知
appLogoOverride引用的本地图片,保留通知要求的圆形裁切。通知没有头像、文件已被清理或图片无法读取时,自动回退应用图标;应用图标读取失败再尝试 Windows 应用图标库,最后使用默认图标。 - Windows 公开通知监听 API 不提供图片,因此头像通过兼容方式补全:在已授权监听后,只读 Windows 自身的本地通知存储,按通知 ID 与来源应用 ID 精确定位,并核对时间相差不超过 2 秒、标题和正文一致。Microsoft NotificationBinding API
- 这不是读取 QQ 聊天数据库;不会扫描历史聊天、修改系统通知或下载远程头像。只支持本地固定磁盘上的通知图片,拒绝重解析路径(如链接 / 联接目录)。Windows 或应用更新可能使该兼容路径失效;失败时继续显示应用图标与通知正文。
- 图像保持原比例与透明边缘,以最高 128×128 输出,过大时降低分辨率以适配传输。应用图标的失败结果 30 秒后重试,成功图标每 10 分钟刷新。
- 预览通知头像 只在最近活动中展示图像与状态,不向 XSO 发送已有通知;应用规则和隐私设置同样生效。
软件图标采用海军蓝圆角底、薄荷绿消息气泡和发送箭头,没有渐变与阴影;已用于窗口、托盘、EXE 和安装包。矢量源为 packaging/Assets/App.svg,生成器可重建 PNG 及九种尺寸 ICO。
先按 Win + N 检查 Windows 通知中心。 这款程序使用系统的 UserNotificationListener,只能取得进入 Windows 通知系统且仍可读取的 Toast 通知。
- QQ 自绘的浮动消息窗、悬浮球、应用内部弹窗,不一定是 Windows 系统通知。这些不会被本适配器捕获。
- 如果应用提供相关选项,请开启系统通知及消息预览;同时检查 Windows 的通知设置。
- 如果通知只写着「收到一条消息」,VR 中也只能显示这段文字,无法恢复被隐藏的正文。
- 勿扰模式、全屏规则、应用通知设置可能改变通知是否生成或能否读取;以新的 Windows 测试通知与通知中心结果排查。
- 轮询默认每 750 毫秒一次,两个轮询之间立即被撤回的通知可能无法捕获。
程序不读取 QQ 聊天数据库,不安装 QQ 插件,也不修改 QQ 客户端。
- 默认使用本机
ws://127.0.0.1:42070/?client=notify2XSO。旧版可在设置中显式选择 UDP127.0.0.1:42069,端口可调。 - XSO 暂时不可达时,每隔约 3 秒尝试重连。离线期间的通知丢弃,不在之后补发;WS 失败不会偷偷改走 UDP。
- 初次启动、暂停后恢复、运行中保存设置,都会重新建立基线,跳过通知中心已有条目。
- 相同通知去重;同一 ID 内容更新且创建时间仍在 15 秒内时,可以再次转发。超过 15 秒的消息丢弃。队列最多 48 条,过载时先丢较旧项。
- 大通知默认 8 秒,小通知默认 4 秒;默认静音,不透明度 0.95。可调整时长、音量和不透明度。
- 「隐藏发送人、消息正文与头像」开启后,只提示某应用收到新通知,保留应用图标;跳过联系人 / 群聊头像的读取与预览。保存此设置时会清空最近活动中的旧头像。
- 最近活动只在内存中保留 100 条应用名、时间、状态和图像预览。原始通知 XML、消息正文和头像不写入日志或设置,通知数据仅发送到本机回环地址。
“已发送”只表示接口写入成功。 XSO 的 SendNotification 不提供逐条显示确认;UDP 也无法判断接收端是否在线。最终显示位置、缩放、通知总开关由 XSOverlay 控制。
设置保存到应用的本地 Notify2Xso/settings.json;在设置页点击「打开设置目录」可找到实际位置(MSIX 可能将 LocalAppData 路径重定向到包数据目录)。保存时保留上一份为 .bak。不要在程序运行中直接编辑后期待自动热加载;请用界面保存或退出后编辑。
项目使用 .NET 10、WPF、WinForms 托盘与 Windows WinRT API。核心库不依赖 Windows UI,控制台测试不使用外部测试框架。
安装 .NET 10 SDK,或者放在 .tools/dotnet/。项目的 global.json 接受 .NET 10 的较新 feature band。
# 编译、运行测试、自包含发布、验证并生成 MSIX;不安装应用
.\scripts\build.ps1
# 单独运行核心测试;如果 SDK 安装在 .tools,改用 .\.tools\dotnet\dotnet.exe
dotnet run --project tests/Notify2Xso.Tests/Notify2Xso.Tests.csproj -c Release
# Windows 图标 / 头像测试(使用合成图像及临时通知库,不读取真实消息)
dotnet run --project tests/Notify2Xso.Windows.Tests/Notify2Xso.Windows.Tests.csproj -c Release
# 开发界面(未安装时只能测试 XSO 发送,通知监听需要包身份)
dotnet run --project src/Notify2Xso.App/Notify2Xso.App.csproj
# 渲染真实 WPF 界面,使用合成示例,不请求通知访问
dotnet run --project src/Notify2Xso.App/Notify2Xso.App.csproj -- --ui-smoke artifacts/ui构建脚本通过 NuGet 恢复固定版本 Microsoft.Windows.SDK.BuildTools,验证 Microsoft 的 MakeAppx 签名后打包;不需要 Visual Studio。生成的 package-info.json 含 SHA256,用来检查安装文件是否损坏,不等同于发行者数字签名。
源代码分布:
src/Notify2Xso.Core:分类、通配规则、文本安全、去重、XSO 协议和传输。src/Notify2Xso.App:Windows 授权、轮询、头像兼容读取、应用图标、托盘与设置界面。tests/Notify2Xso.Tests:路由、中文/emoji、格式注入、隐私、去重、真实本地 WS/UDP、并发和取消测试。packaging、scripts:包清单、安装 / 启动 / 卸载、测试通知、构建脚本。docs/PROTOCOL.md:协议依据与设计说明。
1.2.0 已通过 6 组核心测试和 15 组 Windows 图标 / 头像测试;1.2.1 的文字更改已重新编译并检查界面渲染。本次构建的执行结果见 验证记录。尚未做真实 QQ → Windows → VR 显示的端到端验证;请按上面的系统通知、头像预览与 VR 测试步骤完成最后确认。
当前提供 Windows 11 x64 未签名 MSIX 安装包,安装时需要确认 UAC。Windows 10 2004 或更新版本需要使用受信任证书签名的 MSIX。详见 Microsoft 的 unsigned MSIX 文档。
如果需要发行签名包,可使用现有的代码签名证书:
.\scripts\build.ps1 -SigningCertificateThumbprint <证书指纹>证书应已在 CurrentUser\My 中并包含私钥;脚本不会自动创建证书或导入信任。签名与 unsigned 包的身份不同,切换前先卸载旧版本并重新授权。
退出程序后运行 Uninstall.cmd,或者在 Windows「已安装的应用」中卸载 Notify2XSO。卸载脚本只移除当前用户的此应用包,不清理其他应用的通知。包外保存的设置可能保留,可按需手动删除。