ホームページ > バックエンド開発 > C++ > Windows フォームのテキストボックスにリアルタイムのコマンド出力を表示する方法

Windows フォームのテキストボックスにリアルタイムのコマンド出力を表示する方法

Patricia Arquette
リリース: 2025-01-27 12:11:09
オリジナル
916 人が閲覧しました

このコードは、コマンド ライン プロセスを実行し、そのリアルタイム出力を 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 を使用します。
  • 簡略化された引数処理: 文字列補間を使用して引数をより明確に構築します。
  • 個別の TextBox 宣言: TextBox は、より適切に構成するために個別に宣言されます。

Visual Studio デザイナーでフォームに TextBox (例: txtOutput) とボタン (例: btnExecute) を忘れずに追加してください。 コマンドとその引数を入力するためのテキストボックスも必要です。 textBoxCommandtextBoxArguments をテキストボックスの実際の名前に置き換えます。 この改良されたコードは、Windows フォーム アプリケーションでリアルタイムのコマンド出力を表示するための、より堅牢でユーザー フレンドリーなソリューションを提供します。

以上がWindows フォームのテキストボックスにリアルタイムのコマンド出力を表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート