C# 在控制台应用程序中阅读按键
我正在编写一个小应用程序,它将等待按键,然后根据按键内容执行操作。例如,如果未按下任何键,它将继续等待;如果按下键1,它将执行操作1;如果按下键2,它将执行操作2。到目前为止,我已经找到了一些有用的帖子,作为一个例子。至此,我得到了以下代码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
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语句。这有意义吗?