C#餐车程序使用WMPLib播放音乐切换标签页停止,如何实现连续播放
问题原因
你当前的WMPLib.WindowsMediaPlayer实例是窗体加载事件内的局部变量,事件执行完成后该实例没有被任何长期存活的对象引用,.NET垃圾回收器会在触发内存整理时(比如切换标签页导致界面重绘的过程中)销毁该实例,因此播放会无报错直接中断。
修复步骤
- 将播放器实例声明为窗体的全局成员变量,保证它的生命周期和主窗体完全一致,不会被GC意外回收
- 仅在窗体加载时初始化一次播放器,不要在标签页切换事件中重复创建实例
- 窗体关闭时主动释放播放器资源,避免后台残留播放进程
完整示例代码
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
相关产品推荐
相关产品推荐

