无法在VisualBasic中调用WMP的controls.play()函数

问题描述:

我有以下代码:http://pastebin.com/EgjbzqA2这基本上只是一个精简版本http://www.dreamincode.net/forums/topic/57357-mymusic-player/。我希望程序反复播放一个文件,但是,此功能因某种原因不起作用。该程序播放每个文件一次,然后停止。无法在VisualBasic中调用WMP的controls.play()函数

Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange 
    Static Dim PlayAllowed As Boolean = True 
    Select Case CType(NewState, WMPLib.WMPPlayState) 
     Case WMPLib.WMPPlayState.wmppsReady 
      If PlayAllowed Then 
       Player3.controls.play() 
      End If 
     Case WMPLib.WMPPlayState.wmppsMediaEnded 
      ' Start protection (without it next wouldn't play 
      PlayAllowed = False 
      ' Play track 
      Player3.controls.play() 
      ' End Protection 
      PlayAllowed = True 
      updatePlayer() 
    End Select 
End Sub 

PlayAllowed doo-wop是hackorama,当你要求它在事件中做其他事情时,可以解决控制问题。这往往是错误的,他们并不认为地板垫在事件发生时会被猛拉。技术术语是它们不能很好地处理重入问题,这是一个非常普遍的问题。

有一个非常优雅的解决重入的问题,关键是你延迟再次播放同一首歌曲的要求,后引发事件。在Winforms中,通过使用Control.BeginInvoke()可以很容易地获得这样的延迟,目标在一切安定下来之后运行。技术术语是“等待程序重新进入消息循环”。这工作得非常好这一代码,我没有任何麻烦与此代码,在Windows 8测试一遍又一遍地循环播放同一首歌:

Public Class Form1 
    Dim WithEvents Player3 As New WMPLib.WindowsMediaPlayer 
    Dim Song As String = "c:\temp\ding.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 

调整代码为必要的,因为它不会匹配你很好。基本部分是PlayStateChanged事件处理程序中的Me.BeginInvoke()调用。

+1

工程就像一个魅力!非常感激。 – ahota

+0

lol^tenmorechar – Dylansq

我喜欢这个,问题在于你努力的努力去做到这一点。你看,如果你分析封装的MP3播放器文件的内容,你会发现声音障碍被转换成模拟文件而不是二进制数字。这个问题是当你说视频 - 音频播放时只分配给“WMP”。如果您切换操作系统,它可能会工作,但我会继续前进,只是先购买一台新电脑,然后使用它。 感谢和ty :)