【问题标题】:Keypress speed when holding down key按住键时的按键速度
【发布时间】:2014-08-02 00:07:28
【问题描述】:

有没有办法增加同一个按键的一个按键事件和下一个按键事件之间的延迟?

我有一个应用程序,用户可以使用向下/向上键滚动图像。他们可以按下并释放,也可以保持按下状态。有时,当用户一直按住向上/向下键时,他们希望更快地滚动。 我相信一个按键事件和下一个按键事件之间的持续时间是由 Windows 控制的,所以假设我打开记事本并输入字母“a”并按住键,那么我看到的速度是基于一个参数 Windows我相信控制。

我可以在我的 C# 程序中更改运行时的速度吗?并且一旦用户关闭应用,就恢复到正常速度。

【问题讨论】:

  • 这是由 Windows 和键盘驱动程序控制的。您可以使用您喜欢的时间间隔创建一个计时器,然后查看该键是否仍被按下,但我不希望每次都会收到一个新的按键事件。
  • 重复或接近重复:stackoverflow.com/questions/171326/…
  • 对,所以我认为它仍然取决于windows设置的按键间隔
  • 按键重复延迟由键盘内部的键盘控制器实现。修补它是完全不合理的,因为它会影响机器上的每个程序。意外的程序中止将使其永久失控。简单的解决方法是依赖它。使用 KeyDown 和 KeyUp 事件并通过使用 KeyDown 启用的 Timer 获得重复,在 KeyUp 中禁用。您可以随意修改计时器的 Interval 属性。

标签: c# keypress


【解决方案1】:

这是一个系统范围的设置 - 您可以将其拉起并通过查看来阅读

            System.Environment.KeyboardDelay

更多,这个问题已经在这里回答了:Keydown event - cool down

如前所述,不建议修改该值,并且可能会涉及大量额外的权限设置。最好采用 ps2goat 提到的方法并创建一个计时器或线程或操作来检查按键状态并将其传递给您的幻灯片放映控件。

【讨论】:

    【解决方案2】:

    最简单的方法是在表单上为 KeyDown 和 KeyUp 事件创建事件,检查被按下/释放的键并跟踪键以及它们被按下的时间,为你想要的速度创建一个比例滚动和滚动图像的数量。

    在表单上为下面的 TimerTick 方法创建一个新计时器

    类似这样的东西(未经测试,不会编译):

    bool KeyIsDown = false;
    int count = 0;
    
    void OnKeyDown(sender, key e) //This Needs to match the event to call KeyDown
    {
        if(e.key == KeyToScroll)
        {
            KeyIsDown = true;
            count = 0;
            e.handled = true;
        }
    }
    void OnKeyUp(sender, key e) //This Needs to match the event for KeyUp
    {
        if(e.key = KeyToScroll)
        {
            KeyIsDown = false;
            e.handled = true;
        }
    }
    
    void TimerTick() //This needs to match the Timer_OnTick event
    {
        if(KeyIsDown)
        {
            count++;
            ScrollImage()
        }
    }
    
    void ScrollImage()
    {
        //TODO Scroll image based on count (how long the button has been pressed)
    }
    

    【讨论】:

      【解决方案3】:

      我会使用这样的东西:

      private int counter = 0;
      
      //...
      
      private void OnKeyDown(...)
      {
         counter++;
         if (counter == <value>) //it is based on the speed
         {
             counter = 0;
             this.scrollDown();
         }
      }
      

      或者您可以使用Timer,仅在经过一段时间后才允许您向下滚动。 只需使用全局 bool 并将其设置为 true,当您调用 scrollDown 方法时,当计时器滴答到 false 时。

      【讨论】:

        【解决方案4】:

        记录收到的按键次数,并仅在该数字的模上更改图片。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多