WindowsMediaPlayer(WMPLib,wmp.dll)受到所需更改的影响

时间:2013-10-05 11:45:26

标签: c# windows-media-player wmp

编辑:转到第二次更新,以便最简单地重现这种奇怪的行为。

我正在尝试使用WindowsMediaPlayer库播放和停止声音。

我在互联网上搜索了几十页,所有人都说基本游戏需要相同的代码。

但它对我毫无用处。

        WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

        wplayer.URL = path; // relative path, absolute path, mp3 file, wav file.. I've tried everything
        wplayer.controls.play();

我无法让它播放任何声音。

此外,如果我检查currentMedia属性,它会正确识别我的文件,

但声称其持续时间为0:00。

为什么会这样?

更新

我发现问题的答案是Application.Run()

我使用了WinForms项目,但删除了Form和Application.Run行。 (我的所有代码都在主要内容中)

事实证明必须有一个消息循环才能使用(顺便说一句SoundPlayer类是不正确的)

另外(可能是出于同样的原因),在调试模式下,当从一行到另一行时,我听不到任何声音,直到GUI线程被释放。

我仍然非常好奇地理解为什么会这样?

为什么WMP需要消息循环?为什么SoundPlayer不是?

或者我错过了理解?

更新2:

如何重现?

新项目 - > Winforms - >删除Form1 - >转到program.cs

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        TryPlay(); // Do nothing.
        while (true) { }
    }

    static void TryPlay()
    {
        string path = @"001_The Beatles - Help.wav";
        WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
        wplayer.MediaError += wplayer_MediaError;

        wplayer.URL = path;

        wplayer.controls.play();
    }

    static void wplayer_MediaError(object pMediaObject)
    {
        MessageBox.Show("ERROR");
    }
}

如果我们更改Main:

    static void Main()
    {
        //TryPlay();
        new Thread(() => TryPlay()).Start(); // WORKS(!)
        while (true) { }
    }

另一个选择是保持Main这样:

    static void Main()
    {
        TryPlay();
        while (true) { }
    }

但更改TryPlay方法:

    static void TryPlay()
    {
        string path = @"001_The Beatles - Help.wav";
        WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
        wplayer.MediaError += wplayer_MediaError;

        wplayer.URL = path;

        wplayer.controls.play();
        Application.Run(); // <------  WORKS. (why?)
    }

0 个答案:

没有答案