【问题标题】:C# ReadKey crashing console app when called using <nul使用 <nul 调用时 C# ReadKey 崩溃控制台应用程序
【发布时间】:2013-11-25 05:18:24
【问题描述】:

所以我决定开始使用 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");
        }
    }
}

我想知道是否有解决方法,甚至可以在使用 &lt; nul 时忽略 ReadKey

任何帮助表示赞赏。
提前致谢

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

更新 2:现在可以完美运行。谢谢大家的回答!

【问题讨论】:

  • 部落知识无法识别。你能解释一下pause.exe是什么吗?
  • @P.Brian.Mackey pause.exe 是一个 cmd 命令,显示“按任意键继续...”消息,等待您这样做,然后继续执行代码。

标签: c# crash console nul


【解决方案1】:

控制台有一个方法可以检查标准输入是否被重定向。

public static bool IsInputRedirected { get; }

【讨论】:

【解决方案2】:

您的程序抛出该异常是因为 Console.ReadKey(true); 中所述,如 MSDN documentation 所述:

如果intercept参数为真,则按下的键被截取并且 不在控制台窗口中显示;否则,按下的键是 显示出来。

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

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

Console.ReadKey(); //this won't intercept any key pressed

Console.ReadLine();

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

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

【讨论】:

  • 这行得通,但唯一的问题是我正在寻找一种方法来隐藏按下的键。但是,如果没有办法,那就不得不这样做了。
  • 我也更新了我的问题。我也会尝试你的方法,但我找到了一种使用 Console.Write("\b \b") 命令的方法。编辑:您的方法似乎解决了奇怪的“按回车并删除第一个字母”问题。
  • (编辑超时)我尝试使用您的新方法使用
  • @ALTOhDude 我用我的控制台应用程序测试了代码。什么是'
  • @ALTOhDude 你想这样做吗How to redirect stderr to null in cmd.exe
【解决方案3】:

我也遇到了同样的错误。

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

项目名称->右键单击->属性

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

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

【讨论】:

  • 解决了我在调试 Windows 服务项目时遇到的问题。
【解决方案4】:
/// <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) { }
}

【讨论】:

  • 它允许您选择您希望他们按下的键而不是任何键,但您可以轻松地将其修改为任何键。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2018-04-28
相关资源
最近更新 更多