簡體   English   中英

在C#Winforms應用程序中嵌入CMD終端

[英]Embedding a CMD terminal in a C# Winforms application

我打算做的是構建一個應用程序,該應用程序除其他外將像某些IDE一樣在其中嵌入命令行(我發現這非常有用)。

這是我到目前為止的代碼,請注意這是一個Winforms項目:

public partial class Form1 : Form
    {
        Process p = new Process();
        ProcessStartInfo info = new ProcessStartInfo();

        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            info.FileName = "cmd.exe";
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            info.RedirectStandardError = true;
            info.UseShellExecute = false;
            info.CreateNoWindow = true;

            p.StartInfo = info;
            p.Start();
        }

        private void button1_Click(object sender, EventArgs e) {
            using(StreamWriter sw = p.StandardInput) {
                if(sw.BaseStream.CanWrite) {
                    sw.WriteLine(textBox1.Text);
                }
            }
            textBox2.Text = p.StandardOutput.ReadToEnd();
            textBox3.Text = p.StandardError.ReadToEnd();
            p.WaitForExit();
        }
    }
}

如您所見,有3個文本框和一個按鈕:

  • textbox1用於輸入命令
  • textbox2用於標准輸出
  • textbox3用於stderr

關於我的問題:

我只能輸入一個命令,因為執行后,我的CMD窗口消失了。 我知道它消失了,因為我已經設置了info.CreateNoWindow = false; 它的確消失了,如果我嘗試輸入另一個命令,我會得到一個例外。

我將如何繼續保持CMD窗口“活動”,以便我可以隨意使用它? 簡而言之,我想真正模仿CMD行為。

如果不清楚,請隨時詢問更多信息。

額外信息/我嘗試了什么:

我嘗試添加info.Attributes = "/K"; 因為我知道/K應該可以使CMD保持活動狀態。 我也讀過p.WaitForExit(); 應該可以使CMD保持活動狀態,但是從我看來,這僅是為了讀取輸出。 不用說,因為我已經重定向了它的輸出,所以我不需要。 這些解決方案都不起作用,但是我完全有可能以錯誤的方式使用它們。

我需要一個活着的進程,因此我可以輕松地使用cd導航並在需要時執行命令序列,例如在訪問ftpmysql 我知道我可以使用參數解決這兩個示例,但不能針對每個應用程序。 簡而言之,每次都生成一個新進程不是我想要的。 我希望該CMD接口始終保持打開狀態。

cmd進程死於

using(StreamWriter sw = p.StandardInput) {
    if(sw.BaseStream.CanWrite) {
        sw.WriteLine(textBox1.Text);
    }
}

但我無法查明原因。

CMD控制台提供的是用於執行預定義功能的界面(在System32或%PATH%中)。 流程類也具有相同的功能,您可以執行以下操作:當用戶輸入命令文本並在textbox2中按回車鍵(可以是多行,黑色背景,白色文本)時,可以將命令文本傳遞給Process p = new Process(); 並附加結果,使其看起來像單個cmd會話。 現在,在傳遞整個命令文本之前,我們需要分離參數(如果有的話),即出現在第一個空格之后的文本。 例:

SHUTDOWN /S /T 10

其中Shutdown將是文件名,/ S / T 10將是參數。

執行ProcessStartInfo的設置默認目錄之前:-

_processStartInfo.WorkingDirectory = @"%Path%";

否則默認為System32文件夾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM