实时拦截、分析并阻止 Windows Toast 通知 – 通过注入系统服务进程,挂钩 RPC 调用,实现通知的完全控制:提取应用 ID、负载 XML,甚至根据规则静默阻止。
- ✅ 实时拦截 – 在通知弹出前捕获,支持放行或阻止
- ✅ 内容提取 – 获取发送通知的应用名称、通知类型(
Toast)以及完整的 XML 负载(标题、正文、图片等) - ✅ 低侵入性 – 注入
svchost.exe中的Windows Push Notifications User Service,该进程崩溃后由系统自动重启,稳定性高 - ✅ 广泛测试 – 已在 Windows 10 x64 和 Windows 11 x64 上验证通过
- ✅ 极简 Hook – 仅挂钩必要的 RPC 分发函数,对系统性能影响极小
- ✅ 可定制阻断 – 可根据应用名称、通知内容等条件决定是否拦截
Windows Toast 通知通过 RPC 从应用进程传递到 Windows Push Notifications User Service(服务名 WpnUserService,宿主为 svchost.exe)。服务内部最终由 AppEndpoint::PostNotification3 方法处理通知提交。本项目通过注入该服务进程并挂钩 RPC 运行时函数,截获此调用。
-
注入目标
WpnUserService作为用户态服务运行于svchost.exe中,注入和挂钩安全可靠,且服务崩溃后会自动重启,适合长期监控。 -
RPC 拦截点
所有 RPC 调用最终进入RPCRT4!NdrStubCall3。通过挂钩此函数,可以从RPC_MESSAGE结构中提取:- 接口 GUID
- 调用编号(ProcNum)
- 服务器分发表(DispatchTable)
-
定位 PostNotification3
分析发现PostNotification3的接口 GUID 为
{926516E8-D891-45BC-9DE5-6959FB8ECAC5}(IID_IWpnAppEndpoint3),调用编号为0x29。
当检测到匹配的 GUID 和 ProcNum 时,即可从 DispatchTable 中获取该函数的真实地址,进而挂钩。 -
获取通知内容
PostNotification3的第二个参数指向INotificationHandlerProxy接口。该接口的虚表布局稳定(偏移经分析确认),可通过它调用:GetAppId– 获取应用名称GetType– 通常为"Toast"(仅处理此类)GetPayloadType– 通常为"Xml"GetPayloadData– 返回包含通知 XML 的IStream,可解析出标题、内容等
-
拦截实现
在挂钩的PostNotification3代理函数中,既可以先调用原函数让通知正常显示,也可直接返回0(模拟成功)来阻止通知弹出。同时可提取所需信息用于日志记录或策略决策。
- Visual Studio 2019 / 2022
- Windows SDK 10.0.20348.0 或更高
- C++17
- 克隆本仓库
- 打开解决方案
WpnServerviceMonitor.sln - 选择
Release / x64配置 - 生成项目 → 得到
WpnMonitor64.dll
需要管理员权限,测试时使用 tools/SimpleInjectTool_x64.exe pid dllpath注入目标服务进程。

示例(PowerShell 管理员):
Powershell中执行 tools/Toast.ps1 可弹出toast

自定义拦截规则
默认情况下,DLL 会将所有通知信息输出到调试端口(可使用 DebugView 查看)。如需修改拦截逻辑,请编辑 PostNotification3_Proxy 函数中的条件判断,并重新编译。

| 操作系统 | 架构 | 状态 |
|---|---|---|
| Windows 10 | x64 | ✅ 已验证 |
| Windows 11 | x64 | ✅ 已验证 |
| Windows 10 | x86 | ❌ 未测试 |
| Windows Server | - | ❌ 未测试 |
注入系统服务可能引起系统不稳定,建议在虚拟机或测试环境中使用。
作者不对使用本软件造成的任何损失负责。