不允许控制台打印任何键并仅将箭头作为输入
Disallow console to print any keys and take only arrows as input
我在控制台应用程序 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) 方法被覆盖,据我所知就足够了,如果没有,你可以实现其他方法。
当您需要实际写入控制台时,将文本编写器换成默认的以标准输出流作为基本流的文本编写器,瞧:
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);
}
}
`
我在控制台应用程序 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) 方法被覆盖,据我所知就足够了,如果没有,你可以实现其他方法。
当您需要实际写入控制台时,将文本编写器换成默认的以标准输出流作为基本流的文本编写器,瞧:
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);
}
}
`