【问题标题】:C# .NET Process class: How do I send input to a console process that is waiting for input?C# .NET Process 类:如何将输入发送到等待输入的控制台进程?
【发布时间】:2015-03-28 21:22:24
【问题描述】:

情况如下:我们的 C# WPF 应用程序需要解析第 3 方控制台应用程序写入文件的输出。在 WaitForExit() 之后启动进程并解析文件会很容易,但不幸的是,该应用程序是这样编写的,在 20 行输出后,它会停止输出并等待用户点击返回。是的,即使它将输出写入文件,它仍然会暂停并等待用户在写入接下来的 20 行之前点击返回。第 3 方应用程序是完全闭源的,没有希望重新编译它以禁用此行为。它在另一个方面也很奇怪:尽管它是一个控制台应用程序,但它必须在它自己的目录中运行。鉴于它是旧 DOS 应用程序的 win32 端口,我想我不应该感到惊讶。

我知道通常的解决方案,例如 WaitForInputIdle() 或 hacky win32 的东西,但我真的找不到任何适合我的情况。任何涉及找到打开的窗口并通过 win32 发送输入的事情都不适合我们,因为控制台应用程序无法在窗口中运行。

那你怎么看?我还没有找到合适的 win32 hack 吗?也许我应该将控制台应用程序包装在一个 winform 中,然后我可以使用 WaitForInputIdle()?

【问题讨论】:

  • 澄清:当我说控制台应用程序“不能在窗口中运行”时,我的意思是我们不允许将 ProcessStartInfo.CreateNoWindow 设置为 false。那会“破坏用户体验”。
  • 那行不通,当你有这个小小的控制权时,你需要将你的要求降低到合理的程度。

标签: c# winapi system.diagnostics


【解决方案1】:

如果是普通的控制台应用,只需将UseShellExecute 设置为false 并将RedirectStandardInput 设置为true,然后在需要时使用StandardInput 属性写入换行符。

至少 20 年前,使用文件是一种极其过时的方法。每当您发现自己在使用它们时,都应该考虑使用现代标准输入/输出管道。

【讨论】:

  • 'StandardInput.Write('\n')' 或 'WriteLine('\n')' 与发送 0x0D 返回击键是一回事吗?我想我会多尝试一下,但我以前无法使用这种方法,即使我在进程运行时不断将 \n 写入“StandardInput”。使用输出文件当然不是我的主意,而且这个应用程序至少有 20 年的历史了。实际上可能有 30 个。
猜你喜欢
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2015-12-25
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多