1

我正在用 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 类)。

4

2 回答 2

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 之后接受另一个击键。使用 Winform 很容易。使用控制台应用程序会变得更复杂一些。

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

于 2016-07-16T13:26:31.317 回答
0

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

于 2016-07-16T12:54:00.607 回答