我先阐述下问题,我是做了一个音乐播放器。上面添加了timer 初始Enable为true。我在界面上做了播放进度条(trkProgress),
3个Label  分别显示当前播放到的时间(LbPositionTime),
当前播放的歌曲名(SongTitle),
歌曲总长度(lbCountTime)。然后就出现“未将对象引用设置到对象的实例”的错误,起初我认为是timer初始的时候就开始运行,
未能获得axWindowsMediaPlayer1.currentMedia的信息。然后我采用将timer.Enable设置为false,再将歌曲播放后手动启动timer,依然爆出这个异常。求各位懂的高手,大神们讲解。万分感谢!

解决方案 »

  1.   

    出现问题的是这三行代码,但是奇怪的是有一行没出错: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;
      

  2.   

    这个设置下断点,单步调试,看看什么变量为null,而且又使用了,比较容易解决。你可以的。
      

  3.   

    我觉得用PositionChange Event, MediaChange Event或者 CurrentItemChange Event这样的事件比用Timer要好。参考msdn:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx
      

  4.   

    谢谢,我设了断点
    用了MediaChange Event  可以得到总体时间,歌曲名
    但是PositionChange Event, 这个事件具体用法能讲解下吗? 这个当前改变应该指的不是播放器自动播放时,能自动触发的事件吧?,这个需要拉快进才能触发的吧?
    因为,我在这个事件下的获取当前时间,显示到Label.text中,  设置了断点 程序进不来。你能详细讲解下吗?
      

  5.   

    还有一个很奇怪的地方,断点调试时,获得Title和总体时间,Label.text也赋了得到的值,赋值也成功的。
    但是界面上显示不了。请问,这是什么原因啊。
      

  6.   

    人工置顶,求高人解决啊,真的急急急啊。
    代码给贴出来了。
    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;
                    
                }
            }
      

  7.   

    第一个问题:MediaChange事件,用于获取本次播放歌曲的总体时间,歌曲名。
    断点调试时,
    lbCountTime.Text
    trkProgress.Maximum
    SongTitle.Text
    都已经取得应有的值,但是在窗体中没有显示。
    第二个问题:PositionChange事件,是当当前播放到的位置被改变才触发吧。
    怎么用于显示到LbPositionTime中。(我的想法是既然改变才能触发,就在每次开始歌曲刚开始播放的时候自动快进一秒用于触发该事件)。但是第一个问题没有解决,第二个问题看不到效果。
    所以恳求高手们,帮帮忙。真的很急啊,后天就要给朋友了。所有基本功能都实现了,就是这点小问题调试一天了。
    谢谢帮忙!
    谢谢!