public delegate void DelReadErrOutput(string result);
public partial class Form1 : Form
{
// 2.定義委托事件
public event DelReadStdOutput ReadStdOutput;
public event DelReadErrOutput ReadErrOutput;
public Form1()
{
InitializeComponent();
Init();
}
private void Init()
{
//3.將相應函數註冊到委托事件中
ReadStdOutput += new DelReadStdOutput(ReadStdOutputAction);
ReadErrOutput += new DelReadErrOutput(ReadErrOutputAction);
}
private void button1_Click(object sender, EventArgs e)
{
// 啟動進程執行相應命令,此例中以執行ping.exe為例
//參數-a我這邊得不到結果,試了下-an可以得到結果
RealAction("NETSTAT", "-an");
}
private void RealAction(string StartFileName, string StartFileArg)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
Process CmdProcess = new Process();
CmdProcess.StartInfo.WorkingDirectory = @"C:\Windows\System32";
CmdProcess.StartInfo.FileName = StartFileName; // 命令
CmdProcess.StartInfo.Arguments = StartFileArg; // 參數
CmdProcess.StartInfo.CreateNoWindow = true; // 不創建新窗口
CmdProcess.StartInfo.UseShellExecute = false;
CmdProcess.StartInfo.RedirectStandardInput = true; // 重定向輸入
CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向標準輸出
CmdProcess.StartInfo.RedirectStandardError = true; // 重定向錯誤輸出
CmdProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
CmdProcess.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
CmdProcess.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
CmdProcess.EnableRaisingEvents = true; // 啟用Exited事件
CmdProcess.Exited += new EventHandler(CmdProcess_Exited); // 註冊進程結束事件
CmdProcess.Start();
CmdProcess.BeginOutputReadLine();
CmdProcess.BeginErrorReadLine();
// 如果打開註釋,則以同步方式執行命令,此例子中用Exited事件異步執行。
// CmdProcess.WaitForExit();
}
private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
// 4. 異步調用,需要invoke
this.Invoke(ReadStdOutput, new object[] { e.Data+"ss"+e.Data.Length});
}
}
private void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
this.Invoke(ReadErrOutput, new object[] { e.Data });
}
}
private void ReadStdOutputAction(string result)
{
this.textBoxShowStdRet.AppendText(result + "\r\n");
}
private void ReadErrOutputAction(string result)
{
this.textBoxShowStdRet.AppendText(result + "\r\n");
}