答案 0 :(得分:1)
是的,有可能。
您必须将代码拆分为两个按钮,例如start
和stop
Console.ReadKey()
之前的代码进入start
按钮的Click事件,Console.ReadKey()
之后的所有内容都进入stop
按钮的点击事件。
在控制台变体中,所有变量都是方法的本地变量。在不再有效的WinForms变体中,我们将局部变量提升到表单的类级别。
using语句基本上是一个try / catch / finally块,在finally块中调用Dispose。关闭和处理现在成为我们自己的责任,因此在stop
中调用Writer和Capture的Dispose
方法,之后为类变量分配空值。
你最终得到这样的东西:
public class Form1:Form
{
// other stuff
private WasapiCapture capture = null;
private WaveWriter w = null;
private void start_Click(object sender, EventArgs e)
{
capture = new WasapiLoopbackCapture();
capture.Initialize();
//create a wavewriter to write the data to
w = new WaveWriter("dump.wav", capture.WaveFormat));
//setup an eventhandler to receive the recorded data
capture.DataAvailable += (s, capData) =>
{
//save the recorded audio
w.Write(capData.Data, capData.Offset, capData.ByteCount);
};
//start recording
capture.Start();
}
private void stop_Click(object sender, EventArgs e)
{
if (w != null && capture !=null)
{
//stop recording
capture.Stop();
w.Dispose();
w = null;
capture.Dispose();
capture = null;
}
}
}
上述代码改编自this answer用户thefiloe