【问题标题】:Keeping console text with RedirectStandardOutput使用 RedirectStandardOutput 保留控制台文本
【发布时间】:2014-07-13 15:30:44
【问题描述】:

我正在创建一个 Windows 窗体应用程序,并尝试从控制台应用程序获取输出,同时将输出打印在应用程序上。

我尝试创建一个进程,将 RedirectStandardOutput 设置为 true 并将 ExecuteShell 设置为 false,然后我启动了一个运行良好的异步读取操作,问题是我的应用程序“窃取”了应用程序的输出,因此未显示输出不再在应用程序中。

有什么方法可以在将输出保留在控制台应用程序上的同时捕获输出?我正在考虑可能捕获输出,然后将所有输出发送回应用程序的输出流,但我不知道如何实现。

提前致谢,

杰米

【问题讨论】:

    标签: c# redirect output


    【解决方案1】:

    本地方法 AllocConsole 和 FreeConsole 可用于为任何正在运行的进程创建和销毁控制台,子控制台进程将默认使用其父控制台(它们不会创建额外的无用浮动控制台窗口),因此您可以将控制台附加到您自己的进程,启动子进程,然后将输出写入新分配的控制台以完成您想要完成的工作。如果您还需要用户能够向控制台应用程序提供输入,则解决方案会有点麻烦,但仍然可以将一些东西放在一起,启动一个单独的线程,并将控制台输入传递给子进程过程。关于此实现的另一个不错的细节是,如果您愿意,您可以将控制台及其输出保留在子进程退出之后。

    下面的表单有两个按钮,但为了保持示例代码紧凑,我不包括按钮本身,只包括它们的点击事件。

    public partial class RunForm : Form
    {
        public RunForm()
        {
            InitializeComponent();
        }
    
        private void runButton_Click(object sender, EventArgs e)
        {
            NativeMethods.AllocConsole();
    
            using (Process process = new Process())
            {
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.Arguments = "/c echo Hello world!";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
    
                process.Start();
                process.OutputDataReceived += process_OutputDataReceived;
                process.BeginOutputReadLine();
            }
        }
    
        void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);
            // do other things with the output here
        }
    
        private void closeConsoleButton_Click(object sender, EventArgs e)
        {
            NativeMethods.FreeConsole();
        }
    }
    
    internal static class NativeMethods
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool AllocConsole();
    
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool FreeConsole();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2013-06-18
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2013-02-27
      相关资源
      最近更新 更多