You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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音乐菜单参考图

注意事项

  • 最低支持Windows 10 1607及以上版本,所有能力都是系统原生预装,无需额外安装依赖
  • 不需要的控制按钮直接将对应IsXXXEnabled属性设为false即可隐藏

内容的提问来源于stack exchange,提问作者Finn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:08