如何使用Stream.Read()代替Console.ReadKey()?
while (true)
{
var c = Console.In.Read();
Console.WriteLine("input:" + c);
}
但是该值仅在输入整行时返回。
我不想使用Console.ReadKey()实现此功能。因为这不利于测试。
那么如何监视流中用户的键输入?或通过其他方式。(当尽可能不使用该界面时)
答案 0 :(得分:0)
.NET Framework和.NET Core使用Win32函数ReadConsoleInput
来驱动Console.ReadKey()
,该功能一次从控制台缓冲区读取一点数据。
相比之下,使用Console.In
或Console.OpenStandardInput()
调用Win32函数GetStdHandle
,然后将句柄包装在私有类__ConsoleStream
中,私有类在内部使用{{1 }}或ReadFile
Win32函数,具体取决于一些事情。
默认情况下,控制台流配置有ReadConsole
,它会回显您键入的每个字符回到屏幕。这需要设置ENABLE_ECHO_INPUT
。
ENABLE_LINE_INPUT
的文档说明:
ENABLE_LINE_INPUT
或ReadFile
函数仅在读取回车符时返回。如果禁用此模式,则当一个或多个字符可用时,函数将返回。
因此,如果我们要使用ReadConsole
或ReadFile
的流,则需要一个禁用了这两个标志的控制台句柄。可以这样做:
ReadConsole
这将为您提供一个流,即使您尚未输入整行,也可以一次读取一个字符。
请注意,这不会将每个字符打印到屏幕上。如果仍然需要,则必须自己回显它。