2013-05-16 51 views
3

我正在使用TWindowsMediaPlayer,并且遇到问题。当前歌曲完成后,我无法加载新歌曲然后播放。如何让TWindowsMediaPlayer在完成旧曲目后播放新曲目?

procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject; 
      NewState: Integer); 
    begin 
    if (NewState = wmppsMediaEnded) then 
     begin 
     WMPlayer1.URL := FileScanner.SelectSong; 
     writeln('Play triggered on ', String(WMPlayer1.URL)); 
     WMPlayer1.controls.Play; // DOES NOT PLAY THE SONG! 
     end; 
    end; 

这会将首歌,但需要额外的用户干预,真正发挥它。我做的唯一方法就是继续检查wmppsStopped,但是这个事件发生了两次,所以我得到了列表中的每一首奇数歌曲。

关于如何使其正常工作的任何想法?

+0

@JerryDodge如果我没有得到更好的答案我会可能会尝试创建一个外部变量并对其进行测试,因此它不会再次使用wmppsStopped进行触发。奇怪的是,这就是我的大部分SO问题都来自哪里。旧的项目我被困住了,放弃了,但现在想完成。 – Glenn1234

+0

我不能精确确定(和现在不能测试此),但它在参考的陈述的,在['MM_MCINOTIFY'](http://msdn.microsoft.com/en-us/library/windows/desktop/dd757358 (v = vs.85).aspx)消息应该在命令的操作完成时用'MCI_NOTIFY_SUCCESSFUL'标志发送到控件。他们在那里表示,例如对于音频CD,这意味着它完成播放。尝试在“OnNotify”事件中询问“MediaPlayer.NotifyValue”属性的“nvSuccessful”值。 – TLama

+0

试试这个:WMPlayer1.uiMode:='none'; – slotomo

回答

0

我得到了一个似乎有效的答案。由于TWindowsMediaPlayer似乎是异步操作的,因此您不能通过方法触发事件而不允许其他人去。为此,我的猜测是,它拒绝播放方法,因为媒体未正确加载。

procedure TMainWinForm.WMPlayer1OpenStateChange(Sender: TObject; 
    NewState: Integer); 
begin 
    if NewState = wmposMediaOpen then 
    begin 
     WMPlayer1.controls.play; 
    end; 
end; 

procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject; 
    NewState: Integer); 
begin 
    if (NewState = wmppsStopped) and (SpecialPlayListMode) then 
    begin 
     WMPlayer1.URL := FileScanner.SelectSong; 
    end; 
end; 

虽然这并不能解释为什么当别的东西玩,我可以改变的URL和发挥它没有任何麻烦...

相关问题