C#console app:如何在使用ReadKey()循环时阻止用户按住某个键?

时间:2016-07-16 12:43:55

标签: c# loops input console-application console.readkey

我在C#中编写一个控制台应用程序,它使用Console.ReadKey()读取用户输入。它的代码与此类似:

while(true)
{
    switch(Console.ReadKey(true).Key)
    {
        case ConsoleKey.Enter:
            //code
        case ConsoleKey.UpArrow:
            //code
        case ConsoleKey.DownArrow:
            //code
        case ConsoleKey.Escape:
            //code
    }
}

现在的问题是,如果用户按住任何键超过半秒,Windows会将其注册为多次按键。因此,如果,例如,按住Enter键一秒钟,case ConsoleKey.Enter:之后的代码会运行大约十次,而我也不想这样做。

如何按住按钮只能按一次按键?我是否必须使用Windows窗体? (目前我的代码只依赖于Console类。)

2 个答案:

答案 0 :(得分:1)

如果目标只是为了防止键盘输入太快,那么这样的事情可能会起作用:

        DateTime lastPressedTime = DateTime.MinValue;
        while (true)
        {
            var key = Console.ReadKey(true).Key;
            if (DateTime.Now > lastPressedTime.AddSeconds(.5))
            {
                switch (key)
                {
                    case ConsoleKey.Enter:
                    //code
                    case ConsoleKey.UpArrow:
                    //code
                    case ConsoleKey.DownArrow:
                    //code
                    case ConsoleKey.Escape:
                    //code
                }
            }
            lastPressedTime = DateTime.Now;
        }

然而,如果用户合法地快速打字会对用户造成烦恼,因为它会丢弃任何比最后一次按键快1/2秒的内容。

如果你真的想确定他们不只是按住键太长时间,你需要监视一下KeyUp事件,并且在看到KeyUp后才接受另一次击键。使用Winforms很容易。使用控制台应用程序会更复杂一些。

这个问题可能会为监控控制台应用程序中的关键状态提供更多的想法:C# arrow key input for a console app

答案 1 :(得分:0)

您可以使用Timer类在一段时间内(例如,50毫秒或其他时间)仅从控制台读取密钥一次。当用户按住并按住某个键时,它仍会被多次重读,但您可以控制每秒执行代码的次数。