gpt4 book ai didi

vb.net - 无法在 Visual Basic 中调用 WMP 的controls.play() 函数

转载 作者:行者123 更新时间:2023-12-02 11:32:25 25 4
gpt4 key购买 nike

我有以下代码:http://pastebin.com/EgjbzqA2这基本上只是 http://www.dreamincode.net/forums/topic/57357-mymusic-player/ 的精简版本。我想让程序重复播放一个文件,但是,由于某种原因,这个功能不起作用。程序播放每个文件一次,然后停止。

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() 调用。

关于vb.net - 无法在 Visual Basic 中调用 WMP 的controls.play() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13770806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com