首页 >后端开发 >C++ >如何在 Windows 窗体文本框中显示实时命令输出?

如何在 Windows 窗体文本框中显示实时命令输出?

Patricia Arquette
Patricia Arquette原创
2025-01-27 12:11:09918浏览

此代码演示了如何执行命令行进程并在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
  • >更清晰的命名:
  • 更多描述性变量名称可提高可读性()。CommandExecutor workingDirectory
  • 错误流处理:
  • >代码现在读取并显示命令中的错误输出。> >线程安全:
  • 检查从背景线程更新文本框时确保线程安全。
  • emoventir.newline:InvokeRequired>使用
  • 用于跨平台一致的线路断裂。
  • 简化的参数处理:Environment.NewLine使用字符串插值进行清洁参数构建。
  • >单独的文本框声明:单独声明文本框以分别为更好的组织声明。>
  • 请记住在Visual Studio Designer中添加一个文本框(例如,)和一个按钮(例如,)。 您还需要文本框来输入命令及其参数。 用文本框的实际名称替换
。 此改进的代码提供了一种更强大和用户友好的解决方案,用于在Windows表单应用程序中显示实时命令输出。

以上是如何在 Windows 窗体文本框中显示实时命令输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn