Idea by BarryZed Blog & Code by Deepseek-flash
一个小工具:把 Windows 媒体会话的字段全读出来
最近在做跟"当前播放"相关的联调,老是卡在同一个问题:我不知道各个音乐软件到底通过 SMTC 报了什么。有的应用给全套标签和封面,有的只给一个文件名,还有的连时长都是 0。与其一个个猜,不如写个工具把它们全打出来。
于是有了 SMTC Reader。

它能读到什么
SMTC(System Media Transport Controls)就是媒体弹窗和键盘媒体键背后的那层接口。一个会话能报的东西大致分五组:应用身份、播放状态、能力位(能不能暂停、快进、拖动进度)、时间轴、曲目信息。
一条命令就够了:
每次运行还会在 exe 旁边写一份 Markdown 报告,按时间命名,方便回头对比。
几个值得记下来的坑
写这个工具的过程比工具本身更有意思。SMTC 是"约定"不是"保证",踩出来的坑都挺典型。
字段名写错不会报错。 我一开始读的是
ShuffleActive,真名其实是 IsShuffleActive。在 PowerShell 这种动态语言里,读一个不存在的属性不会抛异常,只会安静地给你 null。"随机播放"那一栏永远是空的,而且看不出哪里不对。后来改成用反射枚举 Windows 的类型,并加了一个测试:Windows 哪天增删了能力位,测试先红。进度能算出三百多万小时。 时间轴里的
Position 是应用上次推送时的快照,做进度条得按 LastUpdatedTime 外推。但网易云的 LastUpdatedTime 停在 1601 年,也就是从来没更新过,外推一下就是三百七十多万小时。现在这类时间戳会被直接判为无效,不外推。封面会撒谎。 PotPlayer 丢出来的是 BMP 数据,扩展名写成什么它不管。所以文件扩展名现在按文件头判断,不按应用声称的来。
动态语言还会给你惊喜。 PowerShell 里函数返回单元素数组时会被自动拆包,结果只有一个会话时
$snapshots.Count 变成 null,工具一本正经地告诉你"没有检测到会话"。两个会话时完全正常,只有一个才复现。为什么最后写成了 C#
最初是一百多行的 PowerShell 脚本,能跑,但有三堵墙:执行策略会拦、PowerShell 7 没有 WinRT 投影、字段名写错不报错(就是上面第一条)。所以最后用 .NET 重写了一版:能发成自包含的单文件 exe,用户不用装运行时;渲染层是纯函数,58 个单元测试不需要真的放音乐就能跑;GitHub Actions 里打 tag 会自动产出 win-x64 / win-arm64 和 Release。
字段的逐条说明在 docs/fields.md,示例报告在 docs/sample-report.md。
代码在 Barrryy/SMTC-reader,MIT 协议。如果你也在做媒体会话相关的联调,希望能省你几个小时。
- 作者:BarryZed
- 链接:
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。









