如何在控制台中获取不同键的按键事件

本文关键字:事件 获取 控制台 | 更新日期: 2023-09-27 18:36:15

我尝试在谷歌上搜索这个,但我找不到答案(希望这不仅仅是我糟糕的搜索技能)。但我目前拥有的是:

static void Main(string[] args)
    {
        while (xa == true)
        {
                switch (switchNum)
                {
                    case 0:
                        Console.WriteLine("Text");
                        break;
                    case 1:
                        Console.WriteLine("Stuff");
                        break;
                    case 2:
                        Console.WriteLine("More Stuff");
                        break;
                }       
        }

我想知道的是当我按下一个键时如何更改开关数字。希望每种情况都有 3 个不同的键。

编辑:澄清

所以目前它将像这样从控制台中键入:

Text
Text
Text
Text
Text
Text

我希望当我按下一个键时它变成其他东西,例如"w"

Text
Text
Text
Text
//Press w here
Stuff
Stuff
Stuff
Stuff
//Pressing another key e.g. q
More Stuff
More Stuff
More Stuff
...

所以我不知道的是如何接收不同的密钥,并保持循环运行(因此,readkey() 可能不起作用)。

提前感谢!

如何在控制台中获取不同键的按键事件

您需要使用 Console.ReadKey() 来查看何时按下某个键,并且由于该函数是一个阻止函数,因此您可以使用 Console.KeyAvailable 仅在您知道用户正在按下某些内容时才调用它。您可以在此处和此处阅读更多内容。

您的代码可以更改为:

//console input is read as a char, can be used in place of or converted to old switchNum you used
char input = 'a';//define default so the switch case can use it
while (xa == true)
{
    //If key is pressed read what it is.
    //Use a while loop to clear extra key presses that may have queued up and only keep the last read
    while (Console.KeyAvailable) input = Console.ReadKey(true).KeyChar;
    //the key read has been converted to a char matching that key
    switch (input)
    {
        case 'a':
            Console.WriteLine("Text");
            break;
        case 's':
            Console.WriteLine("Stuff");
            break;
        case 'd':
            Console.WriteLine("More Stuff");
            break;
    }
}

.

编辑:正如Jane评论的那样,您使用的循环没有限制器,它将以运行它的CPU的速度一样快地循环。 您绝对应该在循环中包含System.Threading.Thread.Sleep()以在每个周期之间休息一下,或者通过将while (Console.KeyAvailable) key = Console.ReadKey(true).KeyChar转换为仅key = Console.ReadKey(true).KeyChar来等待打印前的键

我正在研究基于每个短间隔后超时 ReadKey() 的解决方案 参考with Console.Write("''b");到输入密钥的退格键。

然而@Skean的解决方案是伟大的。基于他的回答: -

static void Main(string[] args)
    {
        Console.WriteLine("start");
        bool xa = true;
        int switchNum = 48; // ASCII for '0' Key
        int switchNumBkup = switchNum; // to restore switchNum on ivalid key
        while (xa == true)
        {    
            if (Console.KeyAvailable)
            {
                ConsoleKeyInfo key = Console.ReadKey(true);
                switchNumBkup = switchNum; // to restore switchNum on ivalid key
                switchNum = key.KeyChar; // Get the ASCII of keyPressed
                if (key.Key == ConsoleKey.Escape)
                {
                    Console.WriteLine("Esc Key was pressed. Exiting now....");
                    Console.ReadKey(); // TO Pause before exiting
                    break;
                }
            }
            switch (switchNum)
            {
                    case 48: //ASCII for 0
                        Console.WriteLine("Text");
                        break;
                    case 49: //ASCII for 1
                        Console.WriteLine("Stuff");
                        break;
                    case 50: //ASCII for 2
                        Console.WriteLine("More Stuff");
                        break;
                    default :
                        Console.WriteLine("Invalid Key. Press Esc to exit.");
                        switchNum = switchNumBkup;
                        break;
            }                
            System.Threading.Thread.Sleep(200) ;                
        }
        Console.WriteLine("Exiting ");
    }