首頁 > 後端開發 > C++ > 如何在 Windows 窗體文字方塊中顯示即時命令輸出?

如何在 Windows 窗體文字方塊中顯示即時命令輸出?

Patricia Arquette
發布: 2025-01-27 12:11:09
原創
908 人瀏覽過

此程式碼示範如何執行命令列進程並在 Windows 窗體文字方塊中顯示其實時輸出。 讓我們對其進行改進,使其更加清晰和穩健。

How to Display Real-time Command Output in a Windows Forms TextBox?

改進的程式碼:

此版本添加了錯誤處理、更清晰的變數名稱和改進的線程實踐。

<code class="language-csharp">using System;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Windows.Forms;

public static class CommandExecutor
{
    public delegate void OutputHandler(string line);

    public static int Run(string workingDirectory, string command, string arguments, 
                          OutputHandler outputHandler, bool hideWindow = true)
    {
        int exitCode = -1; // Initialize to an invalid value

        try
        {
            using (var process = new Process())
            {
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.WorkingDirectory = workingDirectory;
                process.StartInfo.Arguments = $"/c \"{command} {arguments}\" 2>&1"; // Redirect stderr to stdout
                process.StartInfo.CreateNoWindow = hideWindow;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;

                if (outputHandler != null)
                {
                    process.OutputDataReceived += (sender, e) =>
                    {
                        if (e.Data != null)
                        {
                            outputHandler(e.Data);
                        }
                    };
                    process.ErrorDataReceived += (sender, e) =>
                    {
                        if (e.Data != null)
                        {
                            outputHandler($"Error: {e.Data}"); //Clearly mark error messages
                        }
                    };
                }

                process.Start();

                if (outputHandler != null)
                {
                    process.BeginOutputReadLine();
                    process.BeginErrorReadLine(); //Begin reading error stream
                    process.WaitForExit();
                }
                else
                {
                    process.WaitForExit();
                }

                exitCode = process.ExitCode;
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        return exitCode;
    }

    public static string GetOutput(string workingDirectory, string command, string arguments)
    {
        StringBuilder output = new StringBuilder();
        Run(workingDirectory, command, arguments, line => output.AppendLine(line));
        return output.ToString();
    }
}


public partial class Form1 : Form
{
    private TextBox txtOutput; //Declare TextBox

    public Form1()
    {
        InitializeComponent();
        txtOutput = new TextBox { Dock = DockStyle.Fill, Multiline = true, ScrollBars = ScrollBars.Both };
        Controls.Add(txtOutput); // Add the TextBox to the form

        //Add a button (btnExecute) to your form in the designer.
    }

    private void btnExecute_Click(object sender, EventArgs e)
    {
        //Get command and arguments from your textboxes (e.g., textBoxCommand, textBoxArguments)
        string command = textBoxCommand.Text;
        string arguments = textBoxArguments.Text;

        CommandExecutor.Run(@"C:\", command, arguments, line =>
        {
            if (txtOutput.InvokeRequired)
            {
                txtOutput.Invoke(new MethodInvoker(() => txtOutput.AppendText(line + Environment.NewLine)));
            }
            else
            {
                txtOutput.AppendText(line + Environment.NewLine);
            }
        });
    }
}</code>
登入後複製

主要改善:

  • 錯誤處理: try-catch 區塊處理流程執行期間潛在的異常。
  • 更清楚的命名:更具描述性的變數名稱可提高可讀性(CommandExecutorworkingDirectory)。
  • 錯誤流處理:程式碼現在讀取並顯示指令的錯誤輸出。
  • 執行緒安全: InvokeRequired 檢查可確保從後台執行緒更新 TextBox 時的執行緒安全性。
  • Environment.NewLine: 使用 Environment.NewLine 實作跨平台的一致換行符。
  • 簡化的參數處理:使用字串插值來實現更清晰的參數構造。
  • 單獨的文字方塊聲明:單獨聲明文字方塊是為了更好的組織。

請記得在 Visual Studio 設計器中為表單新增一個文字方塊(例如 txtOutput)和一個按鈕(例如 btnExecute)。 您還需要文字方塊來輸入命令及其參數。 將 textBoxCommandtextBoxArguments 替換為文字方塊的實際名稱。 此改進的程式碼提供了更強大且使用者友好的解決方案,用於在 Windows 窗體應用程式中顯示即時命令輸出。

以上是如何在 Windows 窗體文字方塊中顯示即時命令輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板