Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在控制台应用程序中阅读按键_C#_.net_Console Application_Listener - Fatal编程技术网

C# 在控制台应用程序中阅读按键

C# 在控制台应用程序中阅读按键,c#,.net,console-application,listener,C#,.net,Console Application,Listener,我正在编写一个小应用程序,它将等待按键,然后根据按键内容执行操作。例如,如果未按下任何键,它将继续等待;如果按下键1,它将执行操作1;如果按下键2,它将执行操作2。到目前为止,我已经找到了一些有用的帖子,作为一个例子。至此,我得到了以下代码 do { while (!Console.KeyAvailable) { if (Console.ReadKey(true).Key == ConsoleKey.NumPad1) { C

我正在编写一个小应用程序,它将等待按键,然后根据按键内容执行操作。例如,如果未按下任何键,它将继续等待;如果按下键1,它将执行操作1;如果按下键2,它将执行操作2。到目前为止,我已经找到了一些有用的帖子,作为一个例子。至此,我得到了以下代码

do
{
    while (!Console.KeyAvailable)
    {
        if (Console.ReadKey(true).Key == ConsoleKey.NumPad1)
        {
            Console.WriteLine(ConsoleKey.NumPad1.ToString());
        }
        if (Console.ReadKey(true).Key == ConsoleKey.NumPad2)
        {
            Console.WriteLine(ConsoleKey.NumPad1.ToString());
        }
    }

} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
这有几个问题,你可能已经猜到了

1) 使用
ReadKey
检测按下哪个键会导致临时暂停,这意味着必须按下该键。我真的需要想办法避免这种情况。可能使用
KeyAvailable
,但我不确定您如何使用它来检测按下了哪个键-有什么想法吗

2)
由于某些原因,
Escape
键不会从应用程序中退出。如果我删除
if
语句,则会执行此操作,但是按上述方式运行代码不允许我使用指定的键退出应用程序-有什么想法吗?

此行为的原因很简单:

只要不按任何键,就可以进入嵌套循环。 在里面,你正在等待一把钥匙并阅读它——所以同样没有钥匙可用。 即使按escape键,您仍然处于嵌套循环中,并且永远不会离开它

您应该做的是循环,直到有一个键可用,然后读取它并检查其值:

ConsoleKey key;
do
{
    while (!Console.KeyAvailable)
    {
        // Do something, but don't read key here
    }

    // Key is available - read it
    key = Console.ReadKey(true).Key;

    if (key == ConsoleKey.NumPad1)
    {
        Console.WriteLine(ConsoleKey.NumPad1.ToString());
    }
    else if (key == ConsoleKey.NumPad2)
    {
        Console.WriteLine(ConsoleKey.NumPad1.ToString());
    }

} while (key != ConsoleKey.Escape);

这正是我想要的,它帮助我理解
keyavable
在做什么-它循环(等待),而没有可用的键。一旦有钥匙可用,它就会中断循环,并继续检查钥匙。非常感谢!坐在那个紧密的内环里似乎不是个好主意。为什么不将所有代码放在一个
if
语句中,并消除内部while循环呢<代码>执行{if(Console.KeyAvailable){key=Console.ReadKey(true.key;…}}}}while(key!=ConsoleKey.Escape)。另一件需要考虑的事情,直接引用<代码>键属性直接在<代码> RealKEY < /Cord>调用中,会导致您丢失关于键按下的其他信息,例如按下了哪些修改键(CTRL、ALT、Shift)。变量
仅在按下键后分配一个值。因此,不可能使用未定义的条件构造do while循环。我想你可以给它分配一个临时值来启动循环(?),但这看起来很混乱-更混乱(虽然可能不像循环时常量那么混乱)。。。如果我误解了,请通知我。谢谢,您仍然会像以前一样在循环外定义
变量,这样它就不会等于
ConsoleKey.Escape
。如果有可用的密钥,您只需调用
ReadKey
。按下某个键后,下次选中
KeyAvailable
时,该键将为true并输入if语句。这有意义吗?