C# 读取管道输入后接收用户输入
我正在用.NET4编写一个小型的交互式控制台应用程序。我想扩展它,以便能够处理可选的重定向输入,如:C# 读取管道输入后接收用户输入,c#,.net,io,console-application,stdin,C#,.net,Io,Console Application,Stdin,我正在用.NET4编写一个小型的交互式控制台应用程序。我想扩展它,以便能够处理可选的重定向输入,如: echo hello | myapp.exe 问题当然是重定向的输入窃取了“键盘流”,所以对Console.Read*()的任何调用都返回null 我目前的情况是: // Read piped input try { bool keyAvailable = Console.KeyAvailable; } catch { string redirected = Console.I
echo hello | myapp.exe
问题当然是重定向的输入窃取了“键盘流”,所以对Console.Read*()的任何调用都返回null
我目前的情况是:
// Read piped input
try
{
bool keyAvailable = Console.KeyAvailable;
}
catch
{
string redirected = Console.In.ReadToEnd();
// Need to do something here to "un-redirect" stdin back to keyboard
}
// Always returns null
String userInput = Console.ReadLine();
在UNIX上,我可以打开一个到/dev/tty的流来获取用户输入,但是如何在Windows上实现这一点呢
谢谢
[编辑]
基于Craig回答的工作解决方案:
首先,我必须使用
FreeConsole().
我可以选择使用
AllocConsole()
但这会创建另一个控制台窗口,这是我不想要的。相反,我使用
我只能推测.NET类控制台持有对先前stdin流的引用,但只有在调用Console.SetIn()
之后,Console.ReadLine()
才返回到其阻塞行为,等待用户输入
现在,我们来研究如果我在运行时重定向了应用程序的标准输出,会发生什么情况:
echo hello | myapp.exe | somewhere ...
该函数应该可以完成这项工作,尽管我只使用它来恢复输出,而不是输入。使用p/Invoke ofFreeConsole()/AttachConsole()和Console.SetIn()的组合确实有效,谢谢!!(我将更新原始帖子以显示完整的代码)
AttachConsole(-1) // -1 = "Parent".
echo hello | myapp.exe | somewhere ...