我正在创建一个windows窗体应用程序,我试图从控制台应用程序获得输出,同时在应用程序上打印输出。
我尝试创建一个进程,将RedirectStandardOutput设置为true,将ExecuteShell设置为false,然后启动了一个异步读取操作,该操作运行良好,问题是我的应用程序“窃取”了应用程序的输出,因此输出不再显示在应用程序中。
是否有任何方法来捕获输出,同时将输出保存在控制台应用程序上?我想也许捕获输出,然后将所有的输出发送回应用程序的输出流,但我不知道如何实现这一点。
提前谢谢你,
杰米
发布于 2014-11-24 09:45:23
本机方法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();
}https://stackoverflow.com/questions/24724292
复制相似问题