- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个应用程序,A 和 B。
多亏了这个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/
我正在尝试运行 ffmpeg使用 Process 执行将输入音频文件转换为 mp3 格式。下面是当我从 cmd.exe 执行此操作时运行良好的示例调用在 Windows 中: "ffmpeg.dll
我想构建一个控制台应用程序,它可能会在某些情况下停止并提示输入一些内容。但我只想在输入可用时提示。 有没有办法知道 Stdin 是否连接到任何东西? 我认为 powershell 可以做到这一点,我也
我有一个从 FileHandle.standardInput 读取的 Swift 程序(在 Objective-C 中,这将是 +[NSFileHandle fileHandleWithStandar
我正在编写一个启动 C# 控制台应用程序的 AIR 应用程序,它们需要进行通信。我想为此使用标准输入/标准输出,但我似乎无法让它工作。 当 C# 应用程序从标准输入获取输入时,它应该通过标准输出将其发
我正在开发一个应用程序,但遇到了死锁问题。 我的代码看起来像这样: Process p = new Process(); // That using an other application 然后我向
下一个 C# 方法调用 rasdial VPN-Name name *。 * 表示从键盘输入密码。但我想将密码从 C# 应用程序传递给进程。 public bool connect(UserCre
我对 Process.StandartInput 编码有疑问。我在我的 Windows 窗体应用程序中使用了一些进程,但输入应该是 UTF-8。 Process.StandardInput.Encod
我试图将大量桌面捕获的图像发送到编码器 (FFmpeg) 标准输入。 以下代码示例有效。 CaptureScreen() 函数在 5-10 毫秒内提供图像。 如果我将图像保存在 MemoryStrea
这是我的第一个问题,所以我会尽可能详细。我目前正在开发一个 C# 程序(我们称之为 TestProgram),该程序测试用 C 编写的不同程序(我将称之为 StringGen)。 TestProgra
我正在尝试在多个 Process 对象之间创建管道。 我可以运行单个进程并捕获其标准输出,但是当我尝试连接多个进程对象时,第二个似乎没有从第一个的标准输入接收到任何数据。 在这段代码中,我使用了 ca
我有 2 个应用程序,A 和 B。 A 在进程中调用 B。 B 做一些事情,比如 Console.WriteLine 和 Console.ReadLine 多亏了这个MSDN Article ,我设法
我正在尝试将一些流通过管道传输到 ffmpeg 并捕获它的输出,以便我可以在我的代码中传递另一个流。这是一个代码示例,它只是在我写入其 StandardInput.BaseStream 后停止进程继续
我有 .sql 文件 (550 MB),我想将它导入到正在运行的 mysql 服务器。我知道 mysql.exe 的路径。 我的想法是模仿命令行导入mysql -u user -ppass db_na
我是一名优秀的程序员,十分优秀!