2013-09-02 4 views
2

В моем текущем проекте у меня есть самодельный аудиоплеер, который работает через мою функцию musictimer(). Ниже приведен суб, который приказывает аудиоплеер перейти к следующей песне, когда кто-то нажал на картинку. Это прекрасно работает.Функциональный вызов работает только при включении MessageBox.Show()?

Private Sub PictureBox4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox4.Click 
    If (ListBox1.Items.Count - 1 > songBeingPlayed) Then 
     musictimer("next") 
    Else 
     musictimer("stop") 
    End If 
End Sub 

Ниже приводится подзадачу, в которой игрок может сыграть следующую песню, когда песня закончена. Этот подраздел также работает, но только когда у меня есть строка MessageBox.Show («blabla»). В противном случае он просто игнорирует musictimer («следующий»). Очевидно, его довольно раздражает, чтобы всплывающие сообщения все время, поэтому я хочу, чтобы оно исчезло. Кто-нибудь знает, что происходит? Я не знаю.

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange 
    If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then 
     musictimer("next") 
     MessageBox.Show("blabla") 
    End If 
End Sub 

My very messy musictimer function.

Function musictimer(ByVal action) 
    If action Is "initial" Then 
     TextBox1.Text = "0:00" 
     Timer1.Stop() 
     secondsCounter = 1 
     doubledigitsecondCounter = 0 
     minuteCounter = 0 
    End If 

    If action Is "reset" Then 
     TextBox1.Text = "0:00" 
     Timer1.Stop() 
     secondsCounter = 1 
     doubledigitsecondCounter = 0 
     minuteCounter = 0 
     Me.AxWindowsMediaPlayer1.URL = "" 
     changePlayButton("play") 
    End If 

    If action Is "start" Then 
     If (ListBox1.Items.Count > 0) Then 
      Me.AxWindowsMediaPlayer1.URL = directoryPath + listboxpl(songBeingPlayed) 
      AxWindowsMediaPlayer1.Ctlcontrols.play() 
      Timer1.Start() 
      changePlayButton("pause") 
     End If 
    End If 

    If action Is "pause" Then 
     Timer1.Stop() 
     AxWindowsMediaPlayer1.Ctlcontrols.pause() 
     changePlayButton("play") 
    End If 

    If action Is "next" Then 
     If (ListBox1.Items.Count - 1 > songBeingPlayed) Then 
      songBeingPlayed += 1 
      musictimer("reset") 
      musictimer("start") 
      changePlayButton("pause") 
     Else 
      musictimer("pause") 
     End If 
    End If 

    If action Is "previous" Then 
     If (songBeingPlayed > 0) Then 
      songBeingPlayed -= 1 
      musictimer("reset") 
      musictimer("start") 
     End If 
    End If 
End Function 
+0

Я добавил функцию. –

ответ

5

Событие PlayStateChanged является довольно печально известным. Это было действительно предназначено, чтобы просто обновить элемент пользовательского интерфейса, который показывает состояние. Делать что-либо с игроком в этом случае очень сложно. Вызов MessagBox может повлиять на то, что он накидывает цикл сообщений, что всегда важно для элементов управления ActiveX.

Лучший способ избежать неприятностей является задержки кода, что делает его запустить после событие был уволен, и игрок возвращается в исходное состояние. Элегантно сделано с помощью метода Control.BeginInvoke(). Например:

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange 
    If e.newState = WMPLib.WMPPlayState.wmppsStopped Then 
     Me.BeginInvoke(New Action(AddressOf NextSong)) 
    End If 
End Sub 

Private Sub NextSong() 
    musictimer("next") 
End Sub 
+0

Спасибо большое, я получил его сейчас! –

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