之前PowerToys的Peek组件一直存在SMTC一旦激活就永久展示的Bug,并且预览音频时还会生成一个额外的SMTC。issue提了很久,一直没修,于是想自己研究一下把它修了。
问题根源
PowerToys中的Peek.UI的设计逻辑是:
- 窗口关闭时,只是隐藏了窗口界面,并没有终止Peek.UI进程
- 无论窗口是否打开、正在预览什么类型的文件,所有文件类型对应的全部预览组件实例都会持续运行,只是不一定在前台显示
- 出于性能优化的考虑,这大概率是有意的设计选择
而在Windows相关SDK中,使用MediaPlayer类播放媒体的应用,默认会自动与SMTC(系统媒体传输控件)集成。
因此,只要用Peek打开过任意文件,Peek.UI进程就会启动,并且SMTC会一直常驻在系统中。
解决方法
知道了问题之后,解决方法也很简单:
- 在恰当的时机,通过将
IsEnabled设为false来禁用MediaPlayer的媒体播放命令管理器,断开MediaPlayer与MediaPlayerElement提供的传输控件之间的关联 - 仅为真正需要媒体控制的文件类型启用SMTC
归根到底,还是SDK设计得太垃圾了,只能用这样粗暴的办法来解决,在这个问题上已经有大量的反馈,但已经设计好的行为再想修改就很难了。相当多的软件在SMTC上的处理存在或存在过Bug,我自己遇到过的就有网易云音乐和微信出过Bug。
在研究过程中,还额外发现一个Bug:预览音频文件时,会出现重复的SMTC。原因是针对音频文件,还额外存在一个实现音频控制功能的MediaPlayer。通过为音频文件增加特殊处理逻辑,这个问题也已修复。
修复后的行为表现
- 预览非媒体文件时,不会显示系统硬件媒体键(Hardware Media Key)UI
- 使用方向键在文件间切换浏览时,仅媒体文件会显示硬件媒体键UI
- 关闭Peek窗口后,系统硬件媒体键UI会同步消失
发布
经过4个月的漫长等待,终于在最新的v0.101.2362版本合入。


欢迎留言