C# 控制台读取按键及组合键

C# 控制台读取按键及组合键

下面代码可以从控制台读取按键,同时也可以读取组合按键。但无法单独读取Shift、Ctrl或Alt。

// TreatControlCAsInput需要配合按键。该属性会导致Console.ReadLine()异常。
// 参考:https://docs.microsoft.com/zh-cn/dotnet/api/system.console.readkey?view=net-6.0
// Prevent example from ending if CTL+C is pressed.
// Ctrl+C视为普通按键,不会杀死控制台。
Console.TreatControlCAsInput = true;
ConsoleKeyInfo cki;
Console.WriteLine("Press any combination of CTL, ALT, and SHIFT, and a console key.");
Console.WriteLine("Press the Escape (Esc) key to quit: \n");
do
{
    cki = Console.ReadKey(intercept: true); //读取输入。默认intercept为false,表示按下的按键会被打印到控制台。
    Console.Write(" --- You pressed ");
    // 这里的"&"在非bool的情况下是位运算符。
    if ((cki.Modifiers & ConsoleModifiers.Alt) != 0) Console.Write("ALT+");
    if ((cki.Modifiers & ConsoleModifiers.Shift) != 0) Console.Write("SHIFT+");
    if ((cki.Modifiers & ConsoleModifiers.Control) != 0) Console.Write("CTL+");
    Console.WriteLine(cki.Key.ToString());
} while (cki.Key != ConsoleKey.Escape);

下面的代码用来读取组合键Alt+H。可以配合Console.TreatControlCAsInput使用,让Alt+C不中止程序。

do
{
    ConsoleKeyInfo cki1 = Console.ReadKey(true);
    if ((cki1.Modifiers & ConsoleModifiers.Alt) != 0 && cki1.Key == ConsoleKey.H)
    {
        Console.WriteLine("触发组合按键Alt+H");
    }
} while (true);

下面的代码用来读取组合键Alt+H+K。

do
{
    // 第一个按键组合,是否为Alt+H
    ConsoleKeyInfo cki1 = Console.ReadKey(true);
    bool condition1 = (cki1.Modifiers & ConsoleModifiers.Alt) != 0 && cki1.Key == ConsoleKey.H;
    // 第二个按键组合,是否为Alt+K
    ConsoleKeyInfo cki2 = Console.ReadKey(true);
    bool condition2 = (cki2.Modifiers & ConsoleModifiers.Alt) != 0 && cki2.Key == ConsoleKey.K;
    if (condition1 && condition2)
    {
        Console.WriteLine("触发组合按键Alt+H+K");
    }
} while (true);

可以再添加一个条件来限制输入。Console.KeyAvailable表示当按键操作可用时。

ConsoleKeyInfo cki;
do
{
    Console.WriteLine("\nPress a key to display; press the 'x' key to quit.");

    // Your code could perform some useful task in the following loop. However,
    // for the sake of this example we'll merely pause for a quarter second.

    // 如果按键操作可用
    while (Console.KeyAvailable == false)
        Thread.Sleep(250); // Loop until input is entered.

    cki = Console.ReadKey(true);
    Console.WriteLine("You pressed the '{0}' key.", cki.Key);
} while (cki.Key != ConsoleKey.X);

我暂时没有可以检测控制台单独按下控制键的检测方法。例如检测控制台按下Alt键的检测方法。