1

我正在尝试在我的 winforms 应用程序中播放音频。为此,我使用这个:

           WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
           string path = "C:\\Windows\\Media\\Ring10.wav";
           wplayer.URL = path;
           wplayer.controls.play();

我使用 WindowsMediaPlayer 类,因为其他类不会以我的音频文件所在的格式播放音频。上面的代码在我添加Process.GetProcesses();或添加Process.GetProcessesByName...到计时器的滴答事件之前有效。

    private void timer1_Tick(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcesses();
    }

计时器第一次计时并执行Process.GetProcesses();时,音频会继续播放。但是,第二次计时器滴答声停止。如果计时器与播放音频的计时器形式相同或不同,则会发生这种情况。我不知道为什么会这样。是什么导致了这个问题?

4

1 回答 1

4

坚持,稍等...

       WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
       string path = "C:\\Windows\\Media\\Ring10.wav";
       wplayer.URL = path;
       wplayer.controls.play();

您是否在某处保留了对 wplayer 的引用?喜欢作为表单上的私有字段?

如果没有,我认为垃圾收集器会随机捡起并杀死它。获取进程列表会产生足够多的临时垃圾以供 GC 启动,这可能只是巧合。

尝试将其更改为

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

[编辑:如果您还有其他问题,请尝试下面的最小示例 - 这应该可以正常工作:

public partial class Form1 : Form
{
    Timer timer = new Timer();
    private WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

    public Form1()
    {
        InitializeComponent();

        string path = "C:\\Users\\Public\\Music\\Sample Music\\Kalimba.mp3";
        wplayer.URL = path;
        wplayer.controls.play();

        timer.Interval = 2000;
        timer.Tick += timer_Tick;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcesses();
        Debug.WriteLine(processes.Length + " running processes");
    }


}
于 2013-07-17T02:27:36.047 回答