gpt4 book ai didi

c# - 执行 "Console.ReadKey"时允许重定向 C# 应用程序的 StandardInput

转载 作者:行者123 更新时间:2023-11-30 15:07:12 31 4
gpt4 key购买 nike

我有 2 个应用程序,A 和 B。

  • A 在进程中调用 B。
  • B 做一些事情,比如 Console.WriteLine 和 Console.ReadLine
  • 多亏了这个MSDN Article ,我设法以某种方式重定向 B 的输出并提供它的输入。

  • 我没能做到,是让 B 中的 Console.ReadKey 函数起作用。我在这个函数周围做了一个 try catch block ,我收到了这个错误消息:

Cannot read keys when either application does not have a console, or when console input has been redirected from a file. Try Console.Read

事实是,我必须使用 Console.ReadKey,所以我需要找到一种方法让它工作...有什么想法吗?

下面是A的代码中有用的部分


在主函数中:

Process P2 = new Process();
P2.StartInfo.FileName = Environment.CurrentDirectory + "\\Main2.exe";
P2.StartInfo.UseShellExecute = false;
P2.StartInfo.RedirectStandardOutput = true;
P2.OutputDataReceived += new DataReceivedEventHandler(WriteOutput);
P2.StartInfo.RedirectStandardInput = true;
P2.Start();
StreamWriter ExeInput = P2.StandardInput;
P2.BeginOutputReadLine();
ConsoleKeyInfo KeyPressed;
do
{
KeyPressed = Console.ReadKey();
if(KeyPressed.Key == ConsoleKey.Enter)
{
Console.WriteLine ();
ExeInput.Write("\n");
}
else
ExeInput.Write(KeyPressed.KeyChar);
} while (!P2.HasExited);

接收输出数据的处理程序:

private static void WriteOutput(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))

{
Console.WriteLine(outLine.Data);
}
}

最佳答案

我不知道在重定向控制台程序的 StdIn/StdOut 时可以使用 ReadKey() 的任何方法。此外,为了从子进程读取和写入,您需要确保使用的是 Console.Out.Write()/Console.In.Read() 以防止子进程抛出异常,因为它缺少控制台窗口。

您可以使用 Convert.ToChar(ExeOutput.Read()) 将输入转换为有效的 KeyChar,模仿 ReadKey()< 的行为 还要记住同步与异步读/写。如果您使用 BeginOutputReadLine() 并异步读取流,则在使用 ExeOutput.Read() 读取所有输入键之前,P2.HasExited 的 while 条件可能变为真>

        .....
P2.Start();
StreamWriter ExeInput = P2.StandardInput;
StreamReader ExeOutput = P2.StandardOutput;
do
{
var k = P2.StandardOutput.Read();
var key = Convert.ToChar(k);
if (key == Convert.ToChar(ConsoleKey.Enter))
{
Console.WriteLine();
ExeInput.Write("\n");
}
else
ExeInput.Write(key);
} while (!P2.HasExited);
....

幸运的是,如果进程在您读取每一行之前退出,流将被缓冲,因此您可以考虑将条件更改为 while(!P2.HasExited && !P2.StandardOutput.EndOfStream) 如果这符合您要完成的目标。

关于c# - 执行 "Console.ReadKey"时允许重定向 C# 应用程序的 StandardInput,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880624/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com