2017-02-20 56 views
3

我不明白我是缺少在这里,但似乎Console.ReadKey()仍处于活动状态,并导致控制台调用Console.ReadKey()后使用Console.ReadLine()时让我输入两次。ReadKey后C#到Console.ReadLine等待输入两次

我已经搜索上下如何逃脱ReadKey()一旦做出选择,但无济于事。

为了澄清,这是出乎意料的行为: 当控制台弹出时,用户会看到这三个选项作为示例。当用户输入“u”或“h”时,控制台不会等待;它立即执行操作,用户不必按输入

我是否在执行此操作时出错?

static void Main(string[] args) 
{ 
    Console.WriteLine("u up"); 
    Console.WriteLine("h home"); 
    Console.WriteLine("x exit"); 
    Console.WriteLine("---------------------------------"); 
    Console.WriteLine("  [Enter Your Selection]"); 
    Console.WriteLine("---------------------------------"); 
    Console.Write("Enter Selection: "); 
    ConsoleKeyInfo selection; 
    Console.TreatControlCAsInput = true; 
    int value; 
    selection = Console.ReadKey(); 
    if (char.IsDigit(selection.KeyChar)) 
    { 
     value = int.Parse(selection.KeyChar.ToString()); 
     value -= 1; 
     Console.WriteLine("You've entered {0}", value); 
    } 
    else 
    { 
     switch (selection.Key) 
     { 
      case ConsoleKey.U: 
       blurp(); 
       break; 

      case ConsoleKey.H: 
       blurp(); 
       break; 

      case ConsoleKey.X: 
       System.Environment.Exit(0); 
       break; 

      default: 
       Console.WriteLine("Invalid Input..."); 
       break; 
     } 
    } 
} 

public static void blurp() 
{ 
    Console.WriteLine(""); 
    Console.Write("Enter Another Value: "); 
    string value = Console.ReadLine(); 
    Console.WriteLine("You've entered {0}", value); 
} 
+1

我不明白这个问题。你暂停,直到按下一个键。如果是U或H,您将暂停等待用户按Enter键。这与你所遇到的有什么不同? – hoodaticus

+1

请澄清你的问题,很难理解你在问什么。 –

+0

如果您运行代码,当用户选择u,h或x时,控制台不会等待,它将执行操作而不必按enter ...在此示例中,我将“blurp”方法放置在u然后h提示用户输入另一个值。当用户输入值并按回车时,控制台强制你在退出之前输入2倍,并且永远不会写入“你输入了等值” – Autonomic

回答

2

我这个代码测试,并得到了相同的行为:

Console.Write("Enter Selection: "); 
Console.TreatControlCAsInput = true; 
ConsoleKeyInfo selection = Console.ReadKey(); 
if (selection.Key == ConsoleKey.U) 
{ 
    Console.Write("Enter Another Value: "); 
    string valueStr = Console.ReadLine(); 
    Console.WriteLine("You've entered {0}", valueStr); 
} 

解决办法是不使用​​,因为这是造成问题。

更多信息在Stack中 溢出问题TreatControlCAsInput issue. Is this a bug?

+0

是的,确认,.. Console.TreatControlCAsInput = true;是问题。谢谢Tatranksky Medved – Autonomic

2

至于结束控制台没有写出

"You've entered ..." 

这种情况发生,因为该计划离开的方法和控制台关闭时终止。或者在不调试的情况下运行(Ctrl + F5),或者在main的末尾添加Console.ReadLine()。

由于Console.ReadKey()的工作方式,控制台不会在第一次输入之后等待。如果您想等待用户按输入,请使用ReadLine()。

至于到Console.ReadLine()存储输入之前等待两次,这是因为使用的是

Console.TreatControlCAsInput = true; 

其与控制台如何接受内部输入弄乱。只是摆脱它。

1

的问题是与设置:

Console.TreatControlCAsInput = true; 

如果注释此行了,一切正常。这是C#中已知的功能。

如果您仍想设置控制台。TreatControlCAsInput = true;您可以添加自定义的方法来读取输入:

public static string CustomReadLine() 
{ 
    ConsoleKeyInfo cki; 
    string value = string.Empty; 

    do 
    { 
     cki = Console.ReadKey(); 

     value = value + cki.Key; 
    } while (cki.Key != ConsoleKey.Enter); 

    return value; 
} 

更改代码

string value = Console.ReadLine(); 

利用这一功能的定制

string value = CustomReadLine(); 

请参阅MSDN文章Console.TreatControlCAsInput Property在您有Console.TreatControlCAsInput = true时读取输入;