The PlayAllowed doo-wop is hackorama to work around a control getting cranky when you ask it to do something else in an event. That often goes wrong, they don't expect the floor mat to be jerked when they fire an event. The technical term is that they don't handle re-entrancy well, a very common problem.
There's a very elegant solution to re-entrancy problems, the key is that you delay the request to play the same song again, after the event was raised. In Winforms you can easily get such a delay by using Control.BeginInvoke(), the target runs after everything settles back down. The technical term for that is "waiting for the program to re-enter the message loop". That worked very well on this code, I had no trouble looping the same song over and over again with this code, tested on Windows 8:
Public Class Form1
Dim WithEvents Player3 As New WMPLib.WindowsMediaPlayer
Dim Song As String = "c:empding.wav"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
PlayCurrentSong()
End Sub
Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange
If NewState = WMPLib.WMPPlayState.wmppsMediaEnded Then
Me.BeginInvoke(New MethodInvoker(AddressOf PlayCurrentSong))
End If
End Sub
Private Sub PlayCurrentSong()
Player3.URL = Song
Player3.controls.play()
End Sub
End Class
Tweak the code as needed since it won't match yours very well. The essential part is the Me.BeginInvoke() call in the PlayStateChanged event handler.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…