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

C#餐车程序使用WMPLib播放音乐切换标签页停止,如何实现连续播放

问题原因

你当前的WMPLib.WindowsMediaPlayer实例是窗体加载事件内的局部变量,事件执行完成后该实例没有被任何长期存活的对象引用,.NET垃圾回收器会在触发内存整理时(比如切换标签页导致界面重绘的过程中)销毁该实例,因此播放会无报错直接中断。

修复步骤

  1. 将播放器实例声明为窗体的全局成员变量,保证它的生命周期和主窗体完全一致,不会被GC意外回收
  2. 仅在窗体加载时初始化一次播放器,不要在标签页切换事件中重复创建实例
  3. 窗体关闭时主动释放播放器资源,避免后台残留播放进程

完整示例代码

public partial class MenuForm : Form // 替换为你实际的窗体类名
{
    // 声明为全局成员变量
    private WMPLib.WindowsMediaPlayer _backgroundPlayer;

    public MenuForm()
    {
        InitializeComponent();
        // 绑定窗体关闭事件,也可以在设计器里绑定
        this.FormClosing += MenuForm_FormClosing;
    }

    private void MenuForm_Load(object sender, EventArgs e)
    {
        try
        {
            _backgroundPlayer = new WMPLib.WindowsMediaPlayer();
            _backgroundPlayer.URL = "runningdownadream.mp3";
            _backgroundPlayer.settings.setMode("loop", true);
            _backgroundPlayer.controls.play();
        }
        catch (Exception ex)
        {
            MessageBox.Show("无法播放背景音乐,请确认已安装Windows Media Player。", "播放错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    private void MenuForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        // 窗体关闭时释放资源
        if (_backgroundPlayer != null)
        {
            _backgroundPlayer.controls.stop();
            _backgroundPlayer.close();
            _backgroundPlayer = null;
        }
    }
}

注意事项

  • 不要在标签页的SelectedIndexChanged切换事件中重复初始化播放器,否则会出现音乐中断、重复播放的问题
  • 如果使用相对路径加载音频文件,需要确认runningdownadream.mp3存放在程序的运行目录下,也可以替换为绝对路径避免找不到文件
  • 后续需要控制播放、暂停、切换曲目时,直接操作全局的_backgroundPlayer实例即可,无需新建播放器对象

原提问附带截图

表单截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:15:04