控制台.KeyAvailable -我如何重置这个布尔值

本文关键字:布尔值 何重置 KeyAvailable 控制台 | 更新日期: 2023-09-27 18:06:44

这里使用c#。我正在创建一个控制台应用程序。我有两个方法来滚动文本,而不是立即显示在屏幕上。一个工作原理与Console.Write()相同,另一个工作原理与Console.WriteLine()相似。不同之处在于每个字符之间有30毫秒的延迟。我试图使它,当你按下一个键,它加速到每个字符之间的5毫秒的延迟。问题是,一旦你按了一个键,控制台。KeyAvailable为true,不会重置,因此它只会延迟5ms。有没有办法把这个设回false,或者我能做些什么来完成这个?下面是我的代码:

    //Console.Write() version
    static void RPGWrite(string write)
    {
        char[] writearray = write.ToCharArray();
        int writearraycount = writearray.Count();
        for (int x = 0; x < writearraycount; x++)
        {
            Console.Write(Convert.ToString(writearray[x]));
            if (Console.KeyAvailable == false)
                System.Threading.Thread.Sleep(30);
            else
                System.Threading.Thread.Sleep(5);                   
        }            
    }
    //Console.WriteLine() version
    static void RPGWriteLine(string write)
    {
        char[] writearray = write.ToCharArray();
        int writearraycount = writearray.Count();
        for (int x = 0; x < writearraycount; x++)
        {
            Console.Write(Convert.ToString(writearray[x]));
            if (Console.KeyAvailable == false)
                System.Threading.Thread.Sleep(30);
            else
                System.Threading.Thread.Sleep(5);
        }
        Console.Write("'n");
    }

控制台.KeyAvailable -我如何重置这个布尔值

[nkvu -将条目从评论移到这里,以防对其他人有所帮助]

AFAIK,将KeyAvailable设置回false实际上是需要从流中读取密钥(例如通过使用Console.ReadKey)。

使用Console.ReadKey(true)将从流中读取一个字符,而不会回显到控制台供用户查看-尽管请注意MSDN文档中关于Alt, Ctrl或Shift键按下的注释。

这是最终为我工作的代码:

    //Console.Write() version
    static void RPGWrite(string write)
    {
        char[] writearray = write.ToCharArray();
        int writearraycount = writearray.Count();
        for (int x = 0; x < writearraycount; x++)
        {
            if (Console.KeyAvailable == false)
            {
                Console.Write(Convert.ToString(writearray[x]));
                System.Threading.Thread.Sleep(30);
            }
            else
            {
                Console.Write(Convert.ToString(writearray[x]));
                if (x < (writearraycount - 1))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 2))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 3))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 4))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                Console.ReadKey(true);
            }
        }           
    }
    //Console.WriteLine() version
    static void RPGWriteLine(string write)
    {
        char[] writearray = write.ToCharArray();
        int writearraycount = writearray.Count();
        for (int x = 0; x < writearraycount; x++)
        {
            if (Console.KeyAvailable == false)
            {
                Console.Write(Convert.ToString(writearray[x]));
                System.Threading.Thread.Sleep(30);
            }
            else
            {
                Console.Write(Convert.ToString(writearray[x]));
                if (x < (writearraycount - 1))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 2))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 3))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                if (x < (writearraycount - 4))
                {
                    x++;
                    Console.Write(Convert.ToString(writearray[x]));
                }
                Console.ReadKey(true);
            }
        }
        Console.Write("'n");
    }