在控制台应用程序中禁用用户输入
本文关键字:用户 输入 控制台 应用程序 | 更新日期: 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;
}
}
我刚刚手写了这个,没有检查,所以如果它不能工作,请告诉我