使用时调用C#ReadKey崩溃控制台应用程序

时间:2013-11-12 20:54:11

标签: c# crash console nul

所以我决定开始用C#编程,我做的一件事就是创建一个“pausec.exe”(pause.exe克隆)。它有效,但在调用它时:

< nul pausec  

......它崩溃了。我得到的错误 - 从西班牙语翻译到我所知的最佳 - 就像这样:

  

未处理的异常:System.InvalidOperationException:无法读取   当任何应用程序没有控制台或时没有   控制台输入已从文件重定向。试试Console.Read。

堆栈跟踪告诉我错误在哪里:

 in System.Console.ReadKey(Boolean intercept)  
 in System.Console.ReadKey()  
 in pausec.Program.Main(String[] args)

这是我正在运行的代码:

using System;

namespace pausec
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
            Console.Write("\n");
        }
    }
}

我想知道是否有解决方法,甚至可能在使用ReadKey时忽略< nul

感谢任何帮助。
提前致谢

更新:找到一种方法,删除拦截(as Alberto Solano suggested),然后添加Console.Write("\b \b");ReadKey方法之后,它可以正常工作。奇怪的是,当我将应用程序复制到我的桌面时,它不会等待用户输入并自动关闭。

更新2 :现在效果很好。谢谢大家回答!

4 个答案:

答案 0 :(得分:7)

控制台有一个方法,您可以检查是否已重定向stdin。

public static bool IsInputRedirected { get; }

答案 1 :(得分:2)

您的程序会抛出该异常,因为Console.ReadKey(true);中已声明Console.ReadKey(); //this won't intercept any key pressed

  

如果拦截参数为true,则截取按下的键   没有显示在控制台窗口中;否则,按下的键是   显示。

您没有阅读或“聆听”键盘上按下的任何键,然后没有键来拦截并且不会显示在控制台窗口中。

如果您只想按任意键关闭程序,请使用:

Console.ReadLine();

ConsoleKeyInfo cki;
Console.Write("Press any key to continue . . . ");
cki = Console.ReadKey(true);

更新:您在评论中询问如何隐藏用户按下的键。这段代码可以解决问题:

{{1}}

答案 2 :(得分:1)

我遇到了同样的错误。

所以我刚检查了我的项目输出类型。

  

ProjectName-&GT; RightClick-&GT;属性

在那里你可以看到你的输出类型。

所以我将其更改为Console应用程序,因为在我的情况下,它似乎是之前的Windows应用程序。然后它的工作正常。

答案 3 :(得分:0)

/// <summary>
/// Written by fredrik92 (http://social.msdn.microsoft.com/Forums/vstudio/en-US/08163199-0a5d-4057-8aa9-3a0a013800c7/how-to-write-a-command-like-pause-to-console?forum=csharpgeneral)
/// Writes a message to the console prompting the user to press a certain key in order to exit the current program.
/// This procedure intercepts all keys that are pressed, so that nothing is displayed in the Console. By default the
/// Enter key is used as the key that has to be pressed.
/// </summary>
/// <param name="key">The key that the Console will wait for. If this parameter is omitted the Enter key is used.</param>    
public static void WriteKeyPressForExit(ConsoleKey key = ConsoleKey.Enter)
{
    Console.WriteLine();
    Console.WriteLine("Press the {0} key on your keyboard to exit . . .", key);
    while (Console.ReadKey(intercept: true).Key != key) { }
}