2013-11-01 2 views
0

это мой код:окна медиаплеера остановки воспроизведения песни, когда PlayStateChange изменена, чтобы играть

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 каждого элемента в listview - дорожка для песни

«lblPlayItemIndex.Text» - это индекс listviewitem, и когда конец песни ... он сделает «lblPlayItemIndex.Text» +1, чтобы получить следующий элемент в listview

на самом деле я сделал это хорошо .... но про когда я закрываю сообщение, воспроизведение песни прекращается.

есть что-то не так в моем коде .... или я должен сделать это другим способом ?? !!

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+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_Tick вызовите новый метод. Интервал 500 должно быть достаточно времени для того, чтобы переход:

Playstate событие изменения:

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 

Тогда от события, изменившегося в плейстате:

Me.BeginInvoke(PlayNext) 

Возможно, проще это метод 3 из this answer, который включает в себя объяснение, что происходит.

Me.BeginInvoke(New MethodInvoker(AddressOf PlayNextItem)) 

Он по-прежнему полагается на отдельный метод (Sub), чтобы играть следующую песню, но вам не нужно объявлять и установки делегата, который вплетен в вызове.

 Смежные вопросы

  • Нет связанных вопросов^_^