【问题标题】:Pause after first keypress, synchronous solution第一次按键后暂停,同步解决
【发布时间】:2019-08-15 17:24:54
【问题描述】:

这里有整个超级简单的 C# 控制台应用程序:

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int left = 0;
            Console.SetCursorPosition(++left, 0);
            while (true)
            {
                ConsoleKeyInfo stisknutaKlavesa = Console.ReadKey(true);

                if (stisknutaKlavesa.Key == ConsoleKey.RightArrow)
                {
                    Console.SetCursorPosition(++left, 0);
                    Console.Write("#");
                }
            }
        }
    }
}

说明:当我按下右键(并按住!!)时,它会快速写入一个哈希值,然后暂停,然后它会流畅地继续写入另一个哈希值。

我怎样才能摆脱这种停顿?我一直在我的一个 winform 应用程序中处理相同的问题,但为简单起见,我将其发布在此控制台应用程序中。

我已经找到了一些关于这个主题的答案,但它们都是关于 javascript (jquery) 的,我不明白如何在我的 c# 项目中应用它。

我也不想以异步方式解决它。请问有这样的解决办法吗?

【问题讨论】:

  • 暂停是指等待Console.ReadKey中的输入吗?
  • 事实上我不知道那个停顿是什么。因为它只出现在第一个和第二个哈希之间,并且没有其他等待。为什么当我按下右箭头并按住它时它稍后不等待?
  • 您的意思是按键之间的“键盘重复延迟”被解释为单次按下还是按住时重复?如果是这样,这是一个系统范围的设置,这里还有一个关于解决它的问题stackoverflow.com/questions/1172621/…
  • 谢谢史蒂夫!我会探索它,但即使现在我看到正确的答案是使用定时器,这(我猜)意味着它不同步。但是感谢那个链接。

标签: c#


【解决方案1】:

这来自于 Windows 控制台(以及 Windows 和其他环境中的大多数其他基于文本的输入)的行为方式。如果您将光标放在任何文本输入上(例如浏览器的地址栏),然后按住箭头键,您会看到它移动一次,暂停,然后开始以更短的暂停重复移动。

实际上,您的控制台的 ReadKey 根据操作系统的一些预定义行为注册按键。

如果您希望能够检测并响应按住某个键的人,则需要使用一种媒介,让您可以对keydownkeyup 等事件进行更多低级访问。诸如 Windows 窗体、WPF、Unity 之类的东西……几乎所有不是 Console 的东西。

此外,如果您想使用与系统处理这些事件的方式不同的时间来响应这些按键事件和按键事件,您将必须创建自己的时间机制,并且仅使用这些事件来提供帮助你知道什么时候事情发生了变化。这方面的例子可以在herehere 找到。

如果您正在尝试制作类似于视频游戏的东西,您可以考虑研究专门为这些用例设计的库,例如 Unity3D。

【讨论】:

  • 非常感谢您的回复。当我捕获 keydown 事件时,我在 winform 中的行为相同。真正相同的行为。为简单起见,我将其放在控制台应用程序项目中。
  • @user7968180:你是对的。我会相应地调整我的答案。
  • 所以不存在同步解决方案。好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
相关资源
最近更新 更多