【问题标题】:C#: Why does the user have to press enter before Console.Readline() will begin reading?C#:为什么用户必须在 Console.Readline() 开始阅读之前按 Enter 键?
【发布时间】:2011-03-25 22:10:41
【问题描述】:

我的程序可以使用 GUI 或命令行运行。当它从命令行运行时,我会在程序启动后请求更多命令(使用 Console.Readline())。但是,在用户按下 Enter 之前(在他们输入输入之前),它不会接受用户的任何输入。

我将项目作为控制台项目启动:

[DllImport("kernel32.dll")]
private static extern bool AllocConsole();

[DllImport("kernel32.dll")]
private static extern bool AttachConsole(int pid);

private static void Main(string[] args)
{
    if (args.Length > 0 && args[0] == "noGUI")
    {
        if (!AttachConsole(-1))
        {
            AllocConsole();
        }
    ...

        List<string> newInput;
        do
        {
            Console.WriteLine();
            Console.Write(@"Enter additional commands: ");
            string inputStr = Console.ReadLine();

            newInput = GetArgs(inputStr);

            if (newInput.Count == 0)
            {
                Console.WriteLine();
                Console.WriteLine(@"Please enter a valid command");
                continue;
            }
            ...
        } while(true)
    }
...

当用户输入“/Exit”时输出如下(例如):

输入其他命令: /Exit

'/Exit' 不是内部或外部命令,可操作 程序或批处理文件。

但是,如果用户首先按 Enter 键(在“输入附加命令:”之后),他们可以正常输入程序的命令。

知道为什么他们必须先按 Enter 键吗?用户在输入之前按下它并不直观,所以我想更改它。

谢谢!

【问题讨论】:

    标签: c# console-application


    【解决方案1】:

    问题在于您附加到命令行处理器 cmd.exe 的控制台。现在有两个程序对输入感兴趣。 Cmd.exe 获胜,它不知道 /Exit 命令应该是什么意思。并显示您看到的错误消息。先回车没问题,cmd.exe不介意。并且你的程序得到了转机。

    创建您自己的控制台,始终调用 AllocConsole()。

    【讨论】:

    • 啊我明白你在说什么,谢谢你的澄清!附言有没有简单的方法可以将它们全部保存在同一个控制台中?
    • 有,你必须以不同的方式启动你的程序。使用start /wait yourapp.exe。这会阻止 cmd.exe 直到您的应用程序退出,您拥有自己的控制台。嗯,实用。
    • 顺便说一句,这是一个很酷的谜题。 +1 关于这个问题,你记录得很好。
    【解决方案2】:

    因为 [Enter] 表示行尾!

    如果您不喜欢这样,请改用Console.ReadKey()Console.Read()

    【讨论】:

    • -1 问题不是要避免按回车,而是必须在 readline 拾取任何东西之前按回车
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2017-06-26
    相关资源
    最近更新 更多