控制台等待KeyPress,但不将任何键读入控制台缓冲区吗?

时间:2019-01-13 01:32:56

标签: c#

我对C#中的控制台感到困惑...基本上,我一直试图将格式化的文本打印到控制台中,并且发现,只要我使用ReadKey,它实际上就会将该char读取到控制台中,这会使我的printOuts全部一发不可收拾。

这是一个愚蠢的例子,但我认为它没有所有多余的令人困惑的代码,这使我无法理解。

        Console.ReadKey(); // Wait for user input before print
        for (int i = 0; i<2000; i++)
        {
            Console.Write('*');
        }
        Console.ReadKey(); // pause console so it dose exit immediately

此代码等待一个ReadKey,ReadKey停止所有操作,直到读取该代码。然后,它只需打印大量*。

此代码的问题是,当您按下anyKey来“传递暂停”时,控制台实际上会读取该键。因此,如果按空格,第一个*是向前一个空格。如果您按ESC键,您实际上会在屏幕上看到一个奇怪的字符,但我不知道它的名字。

Example as an Image 好吧..这真令人讨厌!然后,我尝试使用KeyAvailable ..如果未按下某个键,则返回true。这意味着您可以使用一段时间的while循环来知道是否按下了某个键,而无需实际使用ReadKey()。您甚至可以使用代码仅在按下某个键时才停止循环。如果愿意的话。

        do
        { // do nothing in here.. just loop so it acts like a pause

        } while (!Console.KeyAvailable);

        for (int i = 0; i<2000; i++)
        {
            Console.Write('*');
        }
        Console.ReadKey(); // pause console so it dose exit immediately

这里的问题是,尽管这可行。控制台已经处理了某种形式的用户输入。.尽管它没有执行任何操作,但中断了该循环。

意味着将在下一个应该再次暂停的ReadKey()处使窗口停留在屏幕上。已经按了一个键,然后将该键应用于ReadKey()。应用程序立即关闭。

TL; DR

  1. 除了继续执行一些代码之外,我如何才能暂停控制台并等待用户输入,但是在任何时候都没有反馈到控制台。因此,无需在屏幕上打印,也无需实际阅读输入内容。
  2. 是否可以在您明确允许之前将所有输入锁定在控制台之外?暂时,如果您加载控制台并混搭键盘,这些击键仍在进入缓冲区。.如何在执行一些代码之前停止或清除该键?

谢谢!

1 个答案:

答案 0 :(得分:1)

多亏了Visual Vincent和Elgonzo,我已经找到/得到了解决方案。由于他们没有回复“帖子”,因此我无法将任何内容标记为已解决...因此我正在撰写此帖子,以将他们的观点汇总为该问题的已解决帖子。

您可以找到Console.ReadKey(booleens)<here>的.Net Api内容

基本上,这是说true / false参数将停止视觉反馈到控制台。

Console.ReadKey(true)

停止正在回显到控制台窗口中的读取键。这修复了“ 问题1

其他“ 问题2 ”可以通过“清除输入命令缓冲区”来解决。...我不是100%确信这些术语是正确的..但是有一种方法可以使确保任何不必要的输入都被“使用了”,这样它们就不会干扰实际的用户输入。

while (Console.KeyAvailable) { Console.ReadKey(true); }

这是一个简单的while循环,通过调用ReadKey()并对输入不执行任何操作,循环直到清除所有缓冲的键。

也有关于ManualResetEvent的讨论,但我尚未对此进行研究。

感谢所有帮助!