【问题标题】:C# console app: how to prevent user from holding down a key when using a ReadKey() loop? [duplicate]C# 控制台应用程序:如何防止用户在使用 ReadKey() 循环时按住键? [复制]
【发布时间】:2016-11-19 13:30:52
【问题描述】:

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

【问题讨论】:

  • @HenkHolterman 如果有人故意向按钮发送垃圾邮件,我可以接受。如果代码不小心按住按钮太久,我只是不希望代码运行多次。

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


【解决方案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

【讨论】:

  • 其实我有点喜欢第一种方法。这并不是我想要的,但是在将“按键冷却时间”减少到 50 毫秒后,我发现它对我的程序非常有效。
【解决方案2】:

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

【讨论】:

  • 我认为OP只想运行代码一次,无论用户在释放它之前按住了多少键
  • @niceman 这是正确的。我只想让按住按钮注册为只有一个按键,我不想为按键或任何东西设置“速度限制”。我可能应该在我的问题中澄清这一点。
猜你喜欢
  • 2013-12-01
  • 2013-11-25
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多