懂axWindowsMediaPlayer的高手们,求帮忙!

nanxiao84014021 2012-09-03 01:49:24

我先阐述下问题,我是做了一个音乐播放器。上面添加了timer 初始Enable为true。

我在界面上做了播放进度条(trkProgress),
3个Label 分别显示当前播放到的时间(LbPositionTime),
当前播放的歌曲名(SongTitle),
歌曲总长度(lbCountTime)。

然后就出现“未将对象引用设置到对象的实例”的错误,起初我认为是timer初始的时候就开始运行,
未能获得axWindowsMediaPlayer1.currentMedia的信息。

然后我采用将timer.Enable设置为false,再将歌曲播放后手动启动timer,依然爆出这个异常。

求各位懂的高手,大神们讲解。

万分感谢!
...全文
206 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linjie1113 2012-09-05
  • 打赏
  • 举报
回复
继续置顶求高人讲解、都一天多了。
nanxiao84014021 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我觉得用PositionChange Event, MediaChange Event或者 CurrentItemChange Event这样的事件比用Timer要好。

参考msdn:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx
[/Quote]
还有一个很奇怪的地方,断点调试时,获得Title和总体时间,Label.text也赋了得到的值,赋值也成功的。
但是界面上显示不了。。。。请问,这是什么原因啊。
nanxiao84014021 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

我觉得用PositionChange Event, MediaChange Event或者 CurrentItemChange Event这样的事件比用Timer要好。

参考msdn:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx
[/Quote]
谢谢,我设了断点
用了MediaChange Event 可以得到总体时间,歌曲名
但是PositionChange Event, 这个事件具体用法能讲解下吗? 这个当前改变应该指的不是播放器自动播放时,能自动触发的事件吧?,这个需要拉快进才能触发的吧?
因为,我在这个事件下的获取当前时间,显示到Label.text中, 设置了断点 程序进不来。

你能详细讲解下吗?
linjie1113 2012-09-04
  • 打赏
  • 举报
回复
第一个问题:MediaChange事件,用于获取本次播放歌曲的总体时间,歌曲名。
断点调试时,
lbCountTime.Text
trkProgress.Maximum
SongTitle.Text
都已经取得应有的值,但是在窗体中没有显示。
第二个问题:PositionChange事件,是当当前播放到的位置被改变才触发吧。
怎么用于显示到LbPositionTime中。(我的想法是既然改变才能触发,就在每次开始歌曲刚开始播放的时候自动快进一秒用于触发该事件)。

但是第一个问题没有解决,第二个问题看不到效果。
所以恳求高手们,帮帮忙。真的很急啊,后天就要给朋友了。所有基本功能都实现了,就是这点小问题调试一天了。
谢谢帮忙!
谢谢!
linjie1113 2012-09-04
  • 打赏
  • 举报
回复
人工置顶,求高人解决啊,真的急急急啊。
代码给贴出来了。
private void axWindowsMediaPlayer1_MediaChange(object sender, _WMPOCXEvents_MediaChangeEvent e)
{

PlayerMainFrm.plm.lbCountTime.Text = PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.durationString;
string title = PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.getItemInfo("title");
PlayerMainFrm.plm.trkProgress.Maximum = (int)Math.Round(PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.duration, 1);
PlayerMainFrm.plm.SongTitle.Text = title.Trim();
//PlayerMainFrm.plm.lbCountTime.Visible = true;
// PlayerMainFrm.plm.SongTitle.Visible = true;
//textBox3.Text = PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.getItemInfo("title"); ;


}


private void axWindowsMediaPlayer1_PositionChange(object sender, _WMPOCXEvents_PositionChangeEvent e)
{

PlayerMainFrm.plm.LbPositionTime.Text = PlayerMainFrm.plm.axWindowsMediaPlayer1.Ctlcontrols.currentPositionString;
if ((int)PlayerMainFrm.plm.axWindowsMediaPlayer1.Ctlcontrols.currentPosition <= PlayerMainFrm.plm.trkProgress.Maximum)
{
PlayerMainFrm.plm.trkProgress.Value = (int)PlayerMainFrm.plm.axWindowsMediaPlayer1.Ctlcontrols.currentPosition;

}
}
宝_爸 2012-09-04
  • 打赏
  • 举报
回复
我觉得用PositionChange Event, MediaChange Event或者 CurrentItemChange Event这样的事件比用Timer要好。

参考msdn:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx
宝_爸 2012-09-04
  • 打赏
  • 举报
回复
这个设置下断点,单步调试,看看什么变量为null,而且又使用了,比较容易解决。

你可以的。
linjie1113 2012-09-03
  • 打赏
  • 举报
回复
我也是遇到了这问题,希望有高手能够解决。
nanxiao84014021 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

看不到图片。

出现异常的代码是哪一行?
[/Quote]
出现问题的是这三行代码,但是奇怪的是有一行没出错:

lbCountTime.Text = PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.durationString;
trkProgress.Maximum = (int)Math.Round(PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.duration, 1);
string title = PlayerMainFrm.plm.axWindowsMediaPlayer1.currentMedia.getItemInfo("title");

这一行代码能正确运行:
LbPositionTime.Text = PlayerMainFrm.plm.axWindowsMediaPlayer1.Ctlcontrols.currentPositionString;
cpio 2012-09-03
  • 打赏
  • 举报
回复
看不到图片。

出现异常的代码是哪一行?

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧