WinForms/C#开发音乐播放器如何在系统音量弹窗添加条目并支持媒体键控制

实现方案
你要的效果依赖Windows自带的系统媒体传输控制(System Media Transport Controls, SMTC) 能力,不需要第三方库,直接用Windows内置API就能实现,具体步骤如下:
前置配置
首先需要让你的WinForms项目支持调用Windows Runtime API:
- 若使用.NET 5+,直接修改项目文件的
TargetFramework节点,指定适配的Windows版本:<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> - 若使用.NET Framework,安装NuGet包
Microsoft.Windows.SDK.Contracts即可调用相关API。
核心实现步骤
- 第一步:初始化SMTC实例,启用需要的控制按钮
using Windows.Media; using Windows.Media.Playback; // 初始化MediaPlayer实例(仅用来绑定SMTC,如果你已经用其他播放库比如NAudio,不需要用这个实例播放音频) var dummyMediaPlayer = new MediaPlayer(); var smtc = dummyMediaPlayer.SystemMediaTransportControls; // 启用你需要的媒体控制按钮 smtc.IsPlayEnabled = true; smtc.IsPauseEnabled = true; smtc.IsNextEnabled = true; smtc.IsPreviousEnabled = true; - 第二步:配置音量弹窗显示的媒体信息
var displayUpdater = smtc.DisplayUpdater; // 指定媒体类型为音乐 displayUpdater.Type = MediaPlaybackType.Music; // 配置歌曲信息,会显示在音量弹窗中 displayUpdater.MusicProperties.Title = "当前播放歌曲名称"; displayUpdater.MusicProperties.Artist = "歌手名称"; displayUpdater.MusicProperties.AlbumTitle = "专辑名称"; // 可选:设置专辑封面 // displayUpdater.Thumbnail = RandomAccessStreamReference.CreateFromFile(await StorageFile.GetFileFromPathAsync("本地封面路径")); // 提交更新 displayUpdater.Update(); - 第三步:注册媒体按键事件回调,处理用户操作
smtc.ButtonPressed += (sender, args) => { switch (args.Button) { case SystemMediaTransportControlsButton.Play: // 写入你自己的播放逻辑 smtc.PlaybackStatus = MediaPlaybackStatus.Playing; break; case SystemMediaTransportControlsButton.Pause: // 写入你自己的暂停逻辑 smtc.PlaybackStatus = MediaPlaybackStatus.Paused; break; case SystemMediaTransportControlsButton.Next: // 写入切下一曲逻辑,记得同步更新歌曲信息 break; case SystemMediaTransportControlsButton.Previous: // 写入切上一曲逻辑,记得同步更新歌曲信息 break; } };
注意事项
每次切歌后都要调用displayUpdater.Update()更新显示的歌曲信息,同时同步修改smtc.PlaybackStatus的播放/暂停状态,保证音量弹窗显示的状态和实际播放状态一致。配置完成后,哪怕应用最小化,也会在系统音量弹窗中显示自定义条目,同时自动响应键盘/鼠标的媒体按键操作。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

