【问题标题】:windows media player stops of playing the song when PlayStateChange changed to play当 PlayStateChange 更改为播放时,windows media player 停止播放歌曲
【发布时间】:2016-03-01 09:12:11
【问题描述】:

这是我的代码:

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

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

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

【问题讨论】:

标签: vb.net windows-media-player


【解决方案1】:

当播放器状态改变时,它会改变很多次,如果你将它们打印到控制台窗口就可以看到。在尝试播放下一个之前,您需要留出时间让这些停止。这将显示 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改变事件:

Me.BeginInvoke(PlayNext)

也许更简单的是this answer 中的方法 3,其中包括对发生情况的解释。

Me.BeginInvoke(New MethodInvoker(AddressOf PlayNextItem))

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

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多