通过编写一个控制台下输出用户按键的简单小程序,用来练习控制台下(System.Console类)的一些跟输入按键相关的操作。
获取控制台按键信息
获取控制台下按键信息并可以制定按键字符是否被输出的函数是Console,ReadKey,它返回一个ConsoleKeyInfo。
class Console
static ConsoleKeyInfo ReadKey(bool 是否不显示按键);
ConsoleKeyInfo类包含按键的详细信息:
class ConsoleKeyInfo
Key: ConsoleKey;
//返回ConsoleKey枚举,包含具体按键,比如Escape(Esc), A-Z, D1(数字1), F1...
Modifiers: ConsoleModifiers;
//返回ConsoleModifiers枚举,代表组合按键中的修饰按键:Ctrl, Alt 和 Shift,如果没有组合键的话为0
KeyChar: char;
//代表按键可以显示的文字值,也是Console.ReadKey可以设置的是否显示的文字值
另外还有其他特殊按键的信息比如大小写和小键盘按键。可以通过Console.CapsLock和Console.NumberLock属性来判断。
Console类还提供KeyAvailable属性,配合Console.ReadKey方法来显示是否有按键输入。
控制台Ctrl + C和取消事件
控制台运行用户按Ctrl + C来终止当前控制台运行,在下面的例子中,我们只用Esc键来终止用户输入,因此我们需要禁止Ctrl + C按键来终止控制台输入。
第一种方法是直接用Console类的TreatControlCAsInput属性,设置为true,这样Ctrl + C就是普通的按键输入,而不会终止控制台。
另一种方法是用Console类的CancelKeyPress事件:
Console类的CancelKeyPress事件会发生在控制台取消按键Ctrl + C被按后,在ConsoleCancelEventArgs中有Cancel属性来指定是否取消结束控制台的操作。设置为true后那么Ctrl + C就不会再结束控制台了
Console.CancelKeyPress += (sender, e) =>
{
e.Cancel = true;
//Ctrl + C关闭企图被取消,
};
示例小程序
代码:
public static void Main()
{
//禁止Ctrl + C终止控制台
Console.TreatControlCAsInput = true;
while (true)
{
//获取ConsoleKeyInfo并不显示输入按键字符
ConsoleKeyInfo key = Console.ReadKey(true);
//Esc退出
if (key.Key == ConsoleKey.Escape)
break;
//输出按键信息
AddKey(key.Key, key.Modifiers);
}
}
static void AddKey(ConsoleKey key, ConsoleModifiers mod)
{
if ((int)mod != 0)
Console.Write(mod.ToString() + " + ");
Console.WriteLine(key);
}