【问题标题】:Disallow console to print any keys and take only arrows as input禁止控制台打印任何键并仅将箭头作为输入
【发布时间】:2015-11-13 07:37:35
【问题描述】:

我在控制台应用程序 C# 中有以下代码。问题是,如果我从键盘提供除箭头以外的任何输入,它会将这些字符打印到控制台上。有没有办法防止在控制台上打印除箭头以外的字符。还有一种方法可以增强以下程序。

class Program
{
    static ConsoleKeyInfo keyinfo;
    // public ConsoleKeyInfo keyinfo;
    static void Main(string[] args)
    {
        do
        {
            keyinfo = Console.ReadKey();
            say();
        }
        while(keyinfo.Key == ConsoleKey.DownArrow 
                || keyinfo.Key == ConsoleKey.UpArrow 
                || keyinfo.Key == ConsoleKey.LeftArrow 
                || keyinfo.Key == ConsoleKey.RightArrow);
    }

    public static void say()
    {
        if(keyinfo.Key == ConsoleKey.DownArrow)
        {
            Console.WriteLine("Down");
        }
        else if(keyinfo.Key == ConsoleKey.UpArrow)
        {
            Console.WriteLine("Up");
        }
        else if(keyinfo.Key == ConsoleKey.RightArrow)
        {
            Console.WriteLine("Right");
        }
        else if(keyinfo.Key == ConsoleKey.LeftArrow)
        {
            Console.WriteLine("Left");
        }
        else
        {
            Console.ReadKey(false);
        }
    }
}

【问题讨论】:

  • 尝试将您的Console.ReadKey();Console.ReadKey(false); 都更改为Console.ReadKey(true);。这个我没测试过,但是msdn-docs状态:"决定是否在控制台窗口显示按下的键。true表示不显示按下的键;否则为false。",所以我'我假设它应该工作。

标签: c# .net console


【解决方案1】:

您必须将输出过滤到标准输出流。

控制台使用文本编写器输出来自标准输入的数据,并且在控制台通过Console.ReadKey() 为您提供密钥之前调用此文本编写器,因此,您无法取消按下字符的输出。但是!

您可以通过Console.SetOut(); 设置自定义文本编写器

下面的代码设置了一个文本编写器,它将过滤所有内容。只有 Write(char) 方法被覆盖,据我所知就足够了,如果没有,您可以实现其他方法。

当您需要实际写入控制台时,将文本写入器交换为具有标准输出流作为基本流的默认写入器,瞧:

class ConsoleFilteredOutput : TextWriter
    {
        public override void Write(char value)
        {

        }

        public override Encoding Encoding
        {
            get { return Encoding.Unicode; }
        }
    }

    static TextWriter standardOutputWriter = Console.Out;
    static ConsoleFilteredOutput filteredOutputWriter = new ConsoleFilteredOutput();

    static void WriteUnfiltered(string text)
    {
        Console.SetOut(standardOutputWriter);
        Console.WriteLine(text);
        Console.SetOut(filteredOutputWriter);
    }

    static void Main(string[] args)
    {
        Console.SetOut(filteredOutputWriter);

        do
        {
            ConsoleKeyInfo keyinfo = Console.ReadKey();
            switch (keyinfo.Key)
            {
                case ConsoleKey.DownArrow:
                case ConsoleKey.LeftArrow:
                case ConsoleKey.UpArrow:
                case ConsoleKey.RightArrow:
                    WriteUnfiltered(keyinfo.Key.ToString());
                    break;
            }
        }
        while (true);
    }
}

`

【讨论】:

  • 你试过 ReadKey(true) 吗?我认为这也应该有效,但这无论如何我们可能需要其他时间
  • 是的 ReadKey(true) 有效,但是当我给出一个非箭头字符时,它只是退出应用程序
  • 好的。我认为这些答案更重要的不是它们是否是最好的,而是我们从中获得的新信息和编程方式。保重
猜你喜欢
  • 2015-11-06
  • 2011-01-29
  • 2018-04-05
  • 2011-05-20
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多