不允许控制台打印任何键,并且只将箭头作为输入

本文关键字:输入 打印 控制台 任何键 不允许 | 更新日期: 2023-09-27 18:21:42

我在控制台应用程序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.SetOut(); 设置自定义文本编写器

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

当您需要实际写入控制台时,将文本编写器切换为默认的,将standart输出流作为基本流,瞧:

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);
    }
}

`