如何使用标准输入流代替Console.ReadKey

时间:2019-04-29 05:01:17

标签: c# console

如何使用Stream.Read()代替Console.ReadKey()?

while (true)
{
    var c = Console.In.Read();
    Console.WriteLine("input:" + c);
}

但是该值仅在输入整行时返回。

我不想使用Console.ReadKey()实现此功能。因为这不利于测试。

那么如何监视流中用户的键输入?或通过其他方式。(当尽可能不使用该界面时)

1 个答案:

答案 0 :(得分:0)

.NET Framework和.NET Core使用Win32函数ReadConsoleInput来驱动Console.ReadKey(),该功能一次从控制台缓冲区读取一点数据。

相比之下,使用Console.InConsole.OpenStandardInput()调用Win32函数GetStdHandle,然后将句柄包装在私有类__ConsoleStream中,私有类在内部使用{{1 }}或ReadFile Win32函数,具体取决于一些事情。

默认情况下,控制台流配置有ReadConsole,它会回显您键入的每个字符回到屏幕。这需要设置ENABLE_ECHO_INPUT

ENABLE_LINE_INPUT的文档说明:

  

ENABLE_LINE_INPUTReadFile函数仅在读取回车符时返回。如果禁用此模式,则当一个或多个字符可用时,函数将返回。

因此,如果我们要使用ReadConsoleReadFile的流,则需要一个禁用了这两个标志的控制台句柄。可以这样做:

ReadConsole

这将为您提供一个流,即使您尚未输入整行,也可以一次读取一个字符。

请注意,这不会将每个字符打印到屏幕上。如果仍然需要,则必须自己回显它。