代碼如下, 用委托,異步讀取了,問題是怎么判斷當前指令讀取完成呢?
private Process CmdProcess;
private List<string> commandList = new List<string>();
// private string TempShow = "";
// 上下切換命令時的下標
int index;
// 初始化 Process
private void InitProcess()
{
CmdProcess = new Process();
// 設定要啟動的程式
CmdProcess.StartInfo.FileName = "cmd.exe";
// 設定 引數
//CmdProcess.StartInfo.Arguments = "ipconfig";
// 設定啟動為當前專案的子線層
CmdProcess.StartInfo.UseShellExecute = false; //是否使用作業系統shell啟動
CmdProcess.StartInfo.RedirectStandardInput = true; //接受來自呼叫程式的輸入資訊
CmdProcess.StartInfo.RedirectStandardOutput = true; //由呼叫程式獲取輸出資訊
CmdProcess.StartInfo.RedirectStandardError = true; //重定向標準錯誤輸出
CmdProcess.StartInfo.CreateNoWindow = true; //不顯示程式視窗
// 為異步獲取訂閱事件
CmdProcess.OutputDataReceived += new DataReceivedEventHandler(CmdMessage);
CmdProcess.ErrorDataReceived += new DataReceivedEventHandler(CmdMessage);
// 啟動
CmdProcess.Start();
// 異步獲取命令列內容
CmdProcess.BeginOutputReadLine();
CmdProcess.BeginErrorReadLine();
//CmdProcess.
//CmdProcess.
CmdProcess.StandardInput.AutoFlush = true;
}
public void ShowMessage(string msg)
{
TextBoxWatch.Text += "第" + i + "次,值是" + msg + "\r\n";
}
private void CmdMessage(object sender, DataReceivedEventArgs e)
{
string data = e.Data;
i++;
this.Invoke(new ShowTemp(ShowMessage), data);
//MessageBox.Show("第" + i + "次,值是" + data);
//Console.WriteLine(data);
//this.TextBoxCMDShow.Text += data;
// 直接設定不是一個執行緒會報錯 需要使用委托類
SetTextBox(data);
}
private int i = 0;
// 設定讀取到的訊息到TextBoxCMDShow 中
// 由于是異步 Process 呼叫此方法設定訊息 需要使用委托類
private delegate void ShowTemp(string msg);
public void SetTextBox(string msg)
{
//MessageBox.Show("第" + i + "次,值是" + msg);
// 如果不是當前執行緒 使用委托類
if (this.TextBoxCMDShow.InvokeRequired)
{
// 創建和執行委托類
this.Invoke(new setMessage(SetTextBox), msg);
//MessageBox.Show("創建了委托類"+(i++));
}
else
{
//MessageBox.Show("獲得了Msg" + msg+j++);
this.TextBoxCMDShow.Text += msg + "\r\n";
//this.TextBoxCMDShow.ScrollToCaret();
}
}
// 執行 cmd命令
private void SendCommand(string command)
{
// 如果在startCommand中已經執行了命令 就不在cmd中執行了
if (!StartCommand(command))
{
CmdProcess.StandardInput.WriteLine(command);
}
}
// 特殊命令 不需要cmd執行
private bool StartCommand(string command)
{
string cmd = command.ToLower();
if (cmd.Equals("clear") || cmd.Equals("cls"))
{
// 清屏命令
TextBoxCMDShow.Text = "";
return true;
}
return false;
}
public delegate void setMessage(string msg);
// 按鈕單擊事件 執行命令
private void ButtonCMDInput_Click(object sender, EventArgs e)
{
// 需要執行的cmd命令
string command = this.TextBoxCMDInput.Text.Trim();
if (command.Length > 0)
{
// 執行命令
SendCommand(command);
// 吧當前命令添加到歷史記錄中
commandList.Add(command);
index++;
// 清除命令
this.TextBoxCMDInput.Text = "";
}
//可以連續輸入,一點點輸出
//SendCommand("ping mail.longcheer.com");
//SendCommand("ipconfig");
}
// 鍵盤事件
private void TextBoxCmdInput_KeyUp(object sender, KeyEventArgs e)
{
// 回車事件
if (e.KeyValue == 13)
{
// 執行命令
ButtonCMDInput_Click(null, null);
i = 0;
}
// 上下切換歷史命令
else if (e.KeyValue == 38)
{
// 上 38
// ArgumentOutOfRangeException
if (commandList.Count <= 0 || index <= 0) return;
index--;
this.TextBoxCMDInput.Text = commandList[index];
}
else if (e.KeyValue == 40)
{
// 下 40
// 防止下標越界
if (commandList.Count <= 0 || index >= commandList.Count) return;
index++;
this.TextBoxCMDInput.Text = commandList[index];
}
}
#endregion
private void TextBoxCmdInput_TextChanged(object sender, EventArgs e)
{
}
private void TextBoxCMDShow_TextChanged(object sender, EventArgs e)
{
this.TextBoxCMDShow.SelectionStart = this.TextBoxCMDShow.Text.Length;
//選擇開始的位置,放在字串的末尾 就是length的長度
this.TextBoxCMDShow.SelectionLength = 0;
//設定選中位置開始的字串的長度為0
this.TextBoxCMDShow.ScrollToCaret();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/251063.html
標籤:C#
上一篇:求助替換
下一篇:C#決議xml
