按下某个键时,如何中断(不使用线程)console.readline?

时间:2013-11-01 20:04:36

标签: c# console

让我解释一下,这就是我想要实现的目标:

Enter name:
F4-Quit

有没有办法显示下一行(F4-Quit)而没有readline等待用户输入 在显示之前?原因是我想,在任何时候退出,即使名称尚未输入(光标在等待),这在许多情况下非常有用,在这种情况下,有人在输入信息的过程中改变了主意并想要退出或返回

如果那不可能会有什么方法呢?

谢谢你!

4 个答案:

答案 0 :(得分:8)

只需编写自己的ReadLine()版本即可。这是.NET的TryParse()模式中的TryReadLine()版本:

    static bool TryReadLine(out string result) {
        var buf = new StringBuilder();
        for (; ; ) {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.F4) {
                result = "";
                return false;
            }
            else if (key.Key == ConsoleKey.Enter) {
                result = buf.ToString();
                return true;
            }
            else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) {
                buf.Remove(buf.Length - 1, 1);
                Console.Write("\b \b");
            }
            else if (key.KeyChar != 0) {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
        }
    }

答案 1 :(得分:4)

  

如果那不可能会有什么方法呢?

解决此问题的最佳方法是使用GUI应用程序。这将消除控制台对您的限制。

通常,如果您想要复杂的用户输入控件,那么UI将比控制台更好。

如果必须使用控制台应用程序,则可能需要在循环中使用Console.ReadKey而不是Console.ReadLine,并检查“escape”键击。一旦输入了新的行字符,就可以处理“text”命令/ input / etc.

答案 2 :(得分:2)

这是Jeppe指出的解决方案

 public static void Main()
    {
        ConsoleKeyInfo cki;

        Console.Clear();

        // Establish an event handler to process key press events.
         Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler);

        while (true) {
            Console.Write("Press any key, or 'X' to quit, or ");
            Console.WriteLine("CTRL+C to interrupt the read operation:");

            // Start a console read operation. Do not display the input.
            cki = Console.ReadKey(true);

            // this process can be skipped 
            // Console.WriteLine("  Key pressed: {0}\n", cki.Key);

            // Exit if the user pressed the 'X' key. 
            if (cki.Key == ConsoleKey.F4) break;
       }
}
protected static void myHandler(object sender, ConsoleCancelEventArgs args)
{
            args.Cancel = true;
            go_back_to_main();
 }

答案 3 :(得分:1)

如果它不一定是F4键,但您可以使用Ctrl + C或Ctrl + Break,那么您可以使用CancelKeyPress event