我正在尝试在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...
添加到计时器的tick事件中。< / p>
private void timer1_Tick(object sender, EventArgs e)
{
Process[] processes = Process.GetProcesses();
}
计时器第一次勾选并执行Process.GetProcesses();
时,音频继续播放。但是,计时器第二次滴答音频停止。如果计时器的形式与播放音频的计时器相同或不同,则会发生这种情况。我不知道为什么会发生这种情况。是什么导致了这个问题?
答案 0 :(得分:4)
坚持......
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
string path = "C:\\Windows\\Media\\Ring10.wav";
wplayer.URL = path;
wplayer.controls.play();
你是否在某个地方保留了对wplayer的引用?就像你表单上的私人领域一样?
如果没有,我认为垃圾收集器会随机捡起并杀死它。获得一个进程列表可能会产生足够的临时垃圾,这可能只是巧合而已.G。来了。
尝试将其更改为
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");
}
}