这是我的代码:
Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
If AxWindowsMediaPlayer1.playState = WMPPlayState.wmppsMediaEnded Then
Dim str As Integer
'the original lblPlayItemIndex.Text = 0 : the index of the first item in the listview
str = lblPlayItemIndex.Text + 1
AxWindowsMediaPlayer1.URL = fmPlaylist.lstPlaylist.Items(str).Tag
AxWindowsMediaPlayer1.Ctlcontrols.play()
MsgBox("str: " & str)
End If
End Sub
我有一个listview作为媒体播放器的播放列表.... 列表视图中每个项目的.tag是歌曲的路径
“lblPlayItemIndex.Text”是listviewitem的索引,当歌曲结束时...它将使“lblPlayItemIndex.Text”+1获得listview中的下一个项目
实际上我做得很好......但是当我关闭歌曲停止播放的消息时问题就出现了....
我的代码有什么问题......或者我应该用另一种方式制作它?!!
答案 0 :(得分:0)
当播放器状态发生变化时,如果您将它们打印到控制台窗口,它会发生很多次变化。在尝试播放下一个之前,您需要留出时间让它们停止。这将显示3种方法。
所有三种补救措施都需要一种方法(Sub
)来播放下一首不事件的歌曲:
Private Sub PlayNextItem()
' however you figure out what to play next...example
If chkRandom.Checked Then
NextIndex = RNG.Next(0, SongList.Length)
Else
NextIndex = If(NextIndex + 1 > SongList.Count - 1, 0, NextIndex + 1)
End If
AxWMP.URL = SongList(NextIndex)
lblNowPlaying.Text = SongList(NextIndex)
AxWMP.Ctlcontrols.play()
End Sub
方法1
你会看到很多,因为它很容易被理解。从PlayStateChange
事件中,激活一个Timer;然后从Timer_Tick
事件中调用您的新方法。 500的间隔应该足以让它过渡:
播放状态更改事件:
If AxWindowsMediaPlayer1.playState = WMPPlayState.wmppsMediaEnded Then
Timer2.Enabled = True
End If
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PlayNextItem()
' be sure to turn off the timer
Timer1.Enabled = False
End Sub
方法2 更简单 - 使用委托:
Delegate Sub PlayNextDelegate()
Dim PlayNext As PlayNextDelegate = AddressOf PlayNextItem
然后从playstate改变了事件:
Me.BeginInvoke(PlayNext)
可能更简单的是来自this answer的方法3 ,其中包含对最新情况的解释。
Me.BeginInvoke(New MethodInvoker(AddressOf PlayNextItem))
它仍然依赖于一个单独的方法(Sub
)播放下一首歌曲,但你不需要声明和设置一个委托,它被编入呼叫。