在控制台应用程序中禁用用户输入

本文关键字:用户 输入 控制台 应用程序 | 更新日期: 2023-09-27 18:12:28

我正在制作一款基于c#主机文本的游戏,因为我想让它看起来更老式,所以我添加了一种效果,这样任何文本(描述,教程,对话)看起来都像是被键入的,它看起来像这样:

public static int pauseTime = 50;
class Writer
{
    public void WriteLine(string myText)
    {
        int pauseTime = MainClass.time;
        for (int i = 0; i < myText.Length; i++)
        {
                Console.Write(myText[i]);
                System.Threading.Thread.Sleep(pauseTime);
        }
        Console.WriteLine("");
    }
}

但后来我认为这可能是恼人的,我想添加一个选项,跳过效果,使所有的文字一次出现。所以我选择回车键作为"跳过"键,它使文本立即出现,但按回车键也创建了一个新的文本行,打乱了文本。

所以我想以某种方式禁用用户输入,以便用户不能在控制台中写入任何内容。是否有一种方法,例如,禁用命令提示符(这里的命令提示符不是指cmd.exe,而是闪烁的"_"下划线符号)?

在控制台应用程序中禁用用户输入

我认为你想要的是Console.ReadKey(true),它会拦截按下的键,而不会显示它。

class Writer
{
    public void WriteLine(string myText)
    {
        for (int i = 0; i < myText.Length; i++)
        {
            if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Enter)
            {
                Console.Write(myText.Substring(i, myText.Length - i));
                break;
            }
            Console.Write(myText[i]);
            System.Threading.Thread.Sleep(pauseTime);
        }
        Console.WriteLine("");
    }
}

来源:MSDN文章

您可以使用这个类监听键输入,而不仅仅是在写入之间睡觉(此处建议):

class Reader {
  private static Thread inputThread;
  private static AutoResetEvent getInput, gotInput;
  private static ConsoleKeyInfo input;
  static Reader() {
    getInput = new AutoResetEvent(false);
    gotInput = new AutoResetEvent(false);
    inputThread = new Thread(reader);
    inputThread.IsBackground = true;
    inputThread.Start();
  }
  private static void reader() {
    while (true) {
      getInput.WaitOne();
      input = Console.ReadKey();
      gotInput.Set();
    }
  }
  public static ConsoleKeyInfo ReadKey(int timeOutMillisecs) {
    getInput.Set();
    bool success = gotInput.WaitOne(timeOutMillisecs);
    if (success)
      return input;
    else
      return null;
  }
}

在你的循环中:

Console.Write(myText[i]);
if (pauseTime > 0)
{
    var key = Reader.ReadKey(pauseTime);
    if (key != null && key.Key == ConsoleKey.Enter)
    {
        pauseTime = 0;
    }
}

我刚刚手写了这个,没有检查,所以如果它不能工作,请告诉我