我想得到一首歌的曲目长度。当我调试它时,我能够获得轨道长度并将其设置为一个名为songDuration的字符串变量。但是,当我实际执行它时,它不起作用,字符串为空。我如何使它工作?我已经尝试过首先初始化变量但仍然是相同的结果。我错过了什么?它在我逐行调试时工作,只是没有运行它。
下面这段代码:
wplayer.controls.play();
songDuration = wplayer.currentMedia.durationString;
这应该是您正在寻找的属性,它接受一个double,因此您需要考虑如何使用您目前拥有的songDuration字符串变量:
player.controls.currentPosition
This MSDN article应该给你一些更多的信息,虽然这些例子指向在网页中使用控件我相信内容应该是相似的。
另外this SO问题似乎相似但已包含答案。
label3.Text =(wmp.Ctlcontrols.currentPosition).ToString(); label4.Text = wmp.Ctlcontrols.currentItem.duration.ToString();
我发现调用player.controls.play()的方法必须退出,并且在.duration和.durationString属性返回正确的值而不是空字符串0之前,播放器必须实际开始播放几分之一秒。
这不起作用:
wplayer.controls.play();
songDuration = wplayer.currentMedia.durationString;
这也行不通:
wplayer.controls.play();
Application.DoEvents();
System.Threading.Thread.Sleep(100000);
Application.DoEvents();
songDuration = wplayer.currentMedia.durationString;
我通过开始播放媒体并退出方法来解决它,创建一个每100毫秒触发一次的Timer事件,每次调用它时,它会检查持续时间是否仍为0,如果不是,则可以捕获持续时间并暂停媒体。另一种方法是使用AxWindowsMediaPlayer,您可以在媒体状态更改时以及开始播放时添加事件处理程序,您可以捕获该事件并查看持续时间。我没有走那条路,也不想采取措施导入正在使用的任何命名空间。也就是说,这就是MSFT建议的:
// Add a delegate for the PlayStateChange event.
player.PlayStateChange += new
AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(player_PlayStateChange);
我没有安装SDK,而是采用了这种方式。像这样启动播放器
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Tick += new EventHandler(GetDuration);
myTimer.Interval = 100;
wplayer.controls.play();
return;
// Check for duration in this other routine which runs every 100 msec until
// Media Player tells us the duration.
private string GetDuration()
{
// public variable songDuration declared elsewhere
songDuration = wplayer.currentMedia.durationString;
if (songDuration.Length > 0) wplayer.controls.pause();
}