C# WPF应用如何接入Windows音乐菜单实现网络电台控制
实现方案
核心是调用Windows原生的系统媒体传输控制(SMTC) 能力,完全基于系统内置API,无需引入任何第三方库,适配.NET Framework 4.7.2 WPF项目。
前置配置
右键你的项目选择「卸载项目」,编辑.csproj项目文件,在第一个<PropertyGroup>节点内添加如下配置:
<TargetPlatformVersion>10.0.17763.0</TargetPlatformVersion>
保存后重新加载项目,即可直接引用Windows Runtime相关的原生API。
核心代码实现
1. 定义SMTC互操作接口
WPF作为桌面程序没有UWP的CoreView上下文,需要通过COM互操作获取SMTC实例,直接把以下代码复制到你的项目中即可:
using System; using System.Runtime.InteropServices; using System.Windows; using Windows.Media; [ComImport] [Guid("ddb0472d-c272-4907-b46c-6b053f2430e9")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface ISystemMediaTransportControlsInterop { SystemMediaTransportControls GetForWindow(IntPtr appWindow, [In] ref Guid riid); }
2. 初始化SMTC
在主窗口的Loaded事件中完成SMTC的初始化配置:
private SystemMediaTransportControls _smtc; private void MainWindow_Loaded(object sender, RoutedEventArgs e) { // 获取当前窗口句柄 var windowHandle = new System.Windows.Interop.WindowInteropHelper(this).Handle; var interop = (ISystemMediaTransportControlsInterop)WindowsRuntimeMarshal.GetActivationFactory(typeof(SystemMediaTransportControls)); Guid guid = typeof(SystemMediaTransportControls).GUID; _smtc = interop.GetForWindow(windowHandle, ref guid); // 启用需要的控制按钮 _smtc.IsPlayEnabled = true; _smtc.IsPauseEnabled = true; _smtc.IsPreviousEnabled = true; _smtc.IsNextEnabled = true; // 注册系统按钮点击事件 _smtc.ButtonPressed += Smtc_ButtonPressed; // 初始更新媒体信息,替换为你自己的初始电台名称 UpdateSmtcMetadata("默认网络电台"); // 同步初始播放状态 _smtc.PlaybackStatus = MediaPlaybackStatus.Stopped; }
3. 处理系统菜单按钮事件
private void Smtc_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args) { // 事件从后台线程触发,需要切回UI线程操作播放器 Dispatcher.Invoke(() => { switch (args.Button) { case SystemMediaTransportControlsButton.Play: case SystemMediaTransportControlsButton.Pause: // 替换为你自己的播放/暂停逻辑 YourPlayerPlayPauseMethod(); break; case SystemMediaTransportControlsButton.Previous: // 替换为你自己的切上一个电台逻辑 SwitchToPreviousStation(); break; case SystemMediaTransportControlsButton.Next: // 替换为你自己的切下一个电台逻辑 SwitchToNextStation(); break; } }); }
4. 同步流名称和播放状态
每次切台、播放状态变更时调用对应方法同步到系统菜单:
// 更新系统菜单显示的流名称 public void UpdateSmtcMetadata(string stationName) { var updater = _smtc.DisplayUpdater; updater.Type = MediaPlaybackType.Music; updater.MusicProperties.Title = stationName; updater.MusicProperties.Artist = "网络电台"; updater.Update(); } // 同步播放状态示例: // 播放时调用:_smtc.PlaybackStatus = MediaPlaybackStatus.Playing; // 暂停时调用:_smtc.PlaybackStatus = MediaPlaybackStatus.Paused; // 停止时调用:_smtc.PlaybackStatus = MediaPlaybackStatus.Stopped;
效果预览

注意事项
- 最低支持Windows 10 1607及以上版本,所有能力都是系统原生预装,无需额外安装依赖
- 不需要的控制按钮直接将对应
IsXXXEnabled属性设为false即可隐藏
内容的提问来源于stack exchange,提问作者Finn
相关产品推荐
相关产品推荐

