Я считаю, что метод, который вызывает 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;
Я решил это, начав воспроизведение медиафайлов и выйдя из метода.создавая событие Timer, которое срабатывает каждые 100 мсек, и каждый раз, когда оно вызывается, оно проверяет, равно ли длительность 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();
}