当PlayStateChange改变播放时,Windows媒体播放器停止播放歌曲

时间:2013-11-01 19:04:07

标签: vb.net windows-media-player

这是我的代码:

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中的下一个项目

实际上我做得很好......但是当我关闭歌曲停止播放的消息时问题就出现了....

我的代码有什么问题......或者我应该用另一种方式制作它?!!

1 个答案:

答案 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)播放下一首歌曲,但你不需要声明和设置一个委托,它被编入呼叫。