问题解决了,贴上自己的代码,希望后面遇到同样问题的同学有帮助:
#region 实现自动下一曲的功能
//这个事件和StatueChange事件存在一个线程之间的调度问题,一个事件没有执行完成,后触发另外一个事件,另外一个事件中又会触发这个事件,结果就是有一个事件队列和事件压栈,可以通过单步调试来看看执行过程
/// <summary>
/// 实现自动下一曲的功能
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///
private void axMediaPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
//在正常播放的时候,播放完成的状态,这个状态后,会重新读取媒体文件,此时重新赋值URL,但是这这个状态下调用播放是不起作用的
if (listSong.Count < 0)
{
return;
}
if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
//int index = listShowSong.SelectedIndex;
//index++;
//if (index > listSong.Count - 1)
//{
// listShowSong.SelectedIndex = 0;
// axMediaPlayer.URL = listSong[0];
//}
//else
//{
// 先改变选择项,后进行赋值
// listShowSong.SelectedIndex = index;
// axMediaPlayer.URL = listSong[index];
//}
//简写代码:
axMediaPlayer.URL=listSong[ listShowSong.SelectedIndex + 1 > listSong.Count - 1 ? listShowSong.SelectedIndex = 0 : ++listShowSong.SelectedIndex];
}
//这个状态的判断必须要在上一个状态MediaEnded后面,因为需要在上一个状态中进行对URL赋值,同时,由于判断状态不一样,在事件的压栈上面处理的顺序也就不一样
if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
{
//添加下面这个判断的要求就是,在上一个MediaEnded中要先改变显示歌曲的listbox中的选择项,然后再对URL赋值,否则这个判断就不起作用。如果不添加这个判断,就会出现上面的错误
if (axMediaPlayer.URL == listSong[listShowSong.SelectedIndex])
{
axMediaPlayer.Ctlcontrols.play();
}
}
}
#endregion
上面代码中,axMediaPlayer是系统中的mediaplayer,listShowSong是界面上用来显示歌曲列表的listbox,listSong是后台中用来存放,对应于界面上歌曲列表的URL值 |