0

这是我的代码:

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

我有一个列表视图作为媒体播放器的播放列表....列表视图中每个项目的 .tag 是歌曲的路径

“lblPlayItemIndex.Text”是 listviewitem 的索引,当歌曲结束时......它将使“lblPlayItemIndex.Text”+1 以获取 listview 中的下一个项目

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

我的代码有什么问题....还是我应该用另一种方式来做??!!

4

1 回答 1

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

方法一

您经常看到这一点,因为它很容易理解。从PlayStateChange事件中,激活一个计时器;然后从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 changed 事件:

Me.BeginInvoke(PlayNext)

这个答案中的方法3可能更简单,其中包括对正在发生的事情的解释。

Me.BeginInvoke(New MethodInvoker(AddressOf PlayNextItem))

它仍然依赖一个单独的方法 ( Sub) 来播放下一首歌曲,但您不需要声明和设置一个委托,它被编织到调用中。

于 2013-11-01T19:57:35.807 回答