【问题标题】:How can I increase the key repeat rate beyond the OS's limit?如何将密钥重复率提高到操作系统限制之外?
【发布时间】:2010-09-15 08:09:30
【问题描述】:

我有使用键盘上的光标键浏览源代码的坏习惯。这是我 15 年来一直在做的事情,这当然意味着我的导航速度受到键盘速度的限制。在 Vista 和 OS X 上(我双启动 MacBook),我的按键重复率一直上升。但在 Visual Studio 和其他应用程序中,速度仍然比我希望的要慢得多。

如何在 Visual Studio 和其他文本编辑器中提高键重复率?

【问题讨论】:

    标签: windows visual-studio macos keyboard


    【解决方案1】:

    在 Windows 中,您可以通过系统调用 (SystemParametersInfo(SPI_SETFILTERKEYS,...)) 进行设置。

    我为自己编写了一个实用程序:keyrate <delay> <repeat>

    Github repository.

    万一链接消失的完整来源:

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    BOOL parseDword(const char* in, DWORD* out)
    {
       char* end;
       long result = strtol(in, &end, 10);
       BOOL success = (errno == 0 && end != in);
       if (success)
       {
           *out = result;
       }
       return success;
    }
    
    
    int main(int argc, char* argv[])
    {
       FILTERKEYS keys = { sizeof(FILTERKEYS) };
    
       if (argc == 1)
       {
          puts ("No parameters given: disabling.");
       }
       else if (argc != 3)
       {
          puts ("Usage: keyrate <delay ms> <repeat ms>\nCall with no parameters to disable.");
          return 0;
       }
       else if (parseDword(argv[1], &keys.iDelayMSec) 
             && parseDword(argv[2], &keys.iRepeatMSec))
       {
          printf("Setting keyrate: delay: %d, rate: %d\n", (int) keys.iDelayMSec, (int) keys.iRepeatMSec);
          keys.dwFlags = FKF_FILTERKEYSON|FKF_AVAILABLE;
       }
    
       if (!SystemParametersInfo (SPI_SETFILTERKEYS, 0, (LPVOID) &keys, 0))
       {
          fprintf (stderr, "System call failed.\nUnable to set keyrate.");
       }
    
       return 0;
    }
    

    【讨论】:

    • 哇,这太棒了。多年来,我一直在寻找类似的东西。它在 Win 64 上对我有用。想知道为什么没有人赞成这个。我也想知道这在内部是如何工作的。似乎您可以在系统设置中更改“正常”设置,并且可以用这些设置覆盖它们。但是“正常”值仍然存在。不知何故,它是按设计分层的?!?
    • 老兄,这太棒了。你是个传奇!
    • 是的,非常感谢——现在我有了 OP 的坏习惯。 (+1)
    • 这在 Windows 7 上运行得相当好。但是,在使用它时,我偶尔会遇到键卡住直到再次按下的问题。这偶尔也会发生在我的 ctrl 键上,触发随机快捷键。这是延迟设置为 150 毫秒,重复率设置为 20 毫秒。
    • @Mud 谢谢这是2018年最好的解决方案!给希望使用此功能的其他人的提示:(1) 打开命令提示符 (2) 输入 &lt;file_location&gt;\keyrate.exe &lt;delay int&gt; &lt;repeat int&gt; 例如C:\Users\Me\Downloads\keyrate.exe 200 7 (3) 完成!
    【解决方案2】:

    很多时候我想在我的窗口中居中一个函数。滚动是唯一的方法。 此外,在有很多非单词字符的代码中,Ctrl-left/right 仍然会很慢。 我也使用键盘。不过,它对我来说有几个问题。一,它有时使用默认速度而不是我设置的实际值。另一个是有时它会忽略初始延迟。我仍然觉得它非常有用。他们在 4 年前说他们将在 6 个月内发布源代码...... :(

    好的,根据修改 HCU\...\Keyboard Response 的人的建议,这对我很有效。

    [HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
    "AutoRepeatDelay"="250"
    "AutoRepeatRate"="13"
    "BounceTime"="0"
    "DelayBeforeAcceptance"="0"
    "Flags"="59"
    

    Windows 标准自动重复延迟。 13 毫秒(77 字符/秒)重复率。 标志打开过滤键? 这些值在登录时读取。请记住注销并重新登录以使其生效。

    【讨论】:

    • 优秀。我唯一调整的是将 DelayBeforeAcceptance 设置为 0。我发现这对于使用 Ctrl+Shift 等键盘组合(用于设置/取消设置书签)是必要的。延迟到 6 点,同时按下键,往往会“丢失”第二个键,导致没有设置书签。
    • 更改这些值似乎对 Windows 7 64 位没有任何影响。
    • 保罗,谢谢。我确实将 DelayBeforeAcceptance 更改为 0,但我忘记了我已经这样做了。前几天我不得不重新安装,但我的 .reg 文件中仍然包含 6。不得不回到这里记住如何修复两键组合不起作用。谢谢。我会为其他人编辑原件。
    • @marc40000 您必须打开过滤键,注销并再次登录才能正常工作。刚刚在Win7 64位上确认。
    • @will-bickford:我刚刚再次尝试了这个 - 现在它可以工作了。我不知道那些年我做了什么不同的事情。我现在在win 8.1上。感谢发布此评论,这让我再次尝试。 :)
    【解决方案3】:

    在 Mac OS X 上,打开 Global Preferences plist

    open ~/Library/Preferences/.GlobalPreferences.plist
    

    然后更改 KeyRepeat 字段。较小的数字将加快您的光标速度。设置对话框只会将其设置为最小值 2,因此如果您转到 0 或 1,您将获得更快的光标。

    我必须重新启动才能生效。

    【讨论】:

    • 如果全局 plist 文件出现在胡言乱语,首先将其转换为xml,然后对其进行编辑,然后像我必须做的那样将其转换回来。见discussions.apple.com/thread.jspa?messageID=8359699
    • 你也可以安装XCode,它会自动打开Propery List Editor
    • 使用 Sublime Text,你可以像 Eddified 所说的那样做。只需安装 Plist Binary 然后运行 ​​De/Encode 功能。
    【解决方案4】:

    对于 Windows,打开 regedit.exe 并导航到 HKEY_CURRENT_USER\Control Panel\Keyboard。根据您的喜好更改键盘速度。

    【讨论】:

    • 这还能用吗? MSDN 声明最大值为 31,您可以在控制面板中正常设置。
    • 如果我尝试设置一个高于 31 的值,行为不会进一步改变。在 Win7 64 位上。
    【解决方案5】:

    我在我的电脑上使用 KeyboardKing。它是免费软件,它可以将重复率提高到 200,这已经足够了。我建议将进程优先级设置为“高”,以实现更顺畅的移动和更少的“重复锁定”,这种情况有时会发生并且非常烦人。具有高优先级,它可以完美运行。

    没有人理解我们为什么用箭头导航。很有趣。

    【讨论】:

      【解决方案6】:

      Visual Assist 有一个选项可以将您在 Visual Studio 中的有效键动作加倍,我一直在使用它。

      【讨论】:

        【解决方案7】:

        正如 hyperlogic 所述,在 Mac OS X 上,内部有两个参数处理键盘速度:KeyRepeatInitialKeyRepeat。在系统偏好设置中,它们映射到Key Repeat RateDelay Until Repeat 滑块。滑块范围和相关的内部参数值(括号中)如下所示。它们似乎是 15 毫秒键盘采样间隔的倍数。

        Key Repeat Rate (KeyRepeat)                 Delay Until Repeat (InitialKeyRepeat)
        |--------------------------------|          |----------------------|-----------------|
        slow (120)                      fast (2)    off (30000)            long (120)        short (25)
        0.5 char/s                      33 char/s       
        

        幸运的是,这些参数可以直接在~/Library/Preferences/.GlobalPreferences.plist 文件中设置超出预定义的限制。我发现以下值对自己最方便:

        KeyRepeat = 1         --> 1/(1*15 ms) = 66.7 char/s
        InitialKeyRepeat = 15 --> 15*15 ms = 225 ms
        

        请注意,在最新的 Mac OS X 版本中,滑块的名称略有不同。

        【讨论】:

          【解决方案8】:

          我确实喜欢独自在键盘上工作。为什么?因为当你使用鼠标时,你必须抓住它。浪费时间。

          另一方面,有时似乎每个应用程序都内置了自己的键盘类型速率。更不用说 BIOS 属性或操作系统设置了。因此,我收集了可以非常快的快捷键(即,您键入 Ctrl + right(arrow)-right-right 比将手指放在 right(arrow) 键上更快:)。

          以下是我认为最有价值的一些键盘快捷键(它适用于 Windows;我不确定 OS X):

          ctrl-right: Go to the end of the previous/the next word (stated before)
          ctrl-left:  Go to the beginning of the previous/the word before (stated before)
          ctrl-up:    Go to the beginning of this paragraph
                      (or to the next paragraph over this)
          ctrl-down:  Go to the end of this paragraph
                      (or to the next paragraph after this)
          ctrl-pos1:  Go to the beginning of the file
          ctrl-end:   Go to the end of the file
          

          所有这些都可以与 shift 键结合使用,以便在执行此操作时选择文本。现在让我们来看看更奇怪的东西:

          alt-esc:     Get the actual application into the background
          ctrl-esc:    This is like pressing the "start-button" in Windows: You can
                       navigate with arrow keys or shortcuts to start programs from here
          ctrl-l:      While using Firefox this accesses the URL-entry-field to simply
                       type URLs (does not work on Stack Overflow :)
          ctrl-tab,
          ctrl-pageup
          ctrl-pagedwn Navigate through tabs (even in your development environment)
          

          所以这些是我在编程时最常用的快捷键。

          【讨论】:

          • 看来你应该调查一下vim。
          • @orlp: ]] } ^U ^D 53j :1207 当然还有vim-easymotion...我发现现在使用任何其他编辑器都很痛苦Vim 几年前“快速修复损坏的 emacs 配置”!
          【解决方案9】:

          对于 OS X,内核扩展 KeyRemap4MacBook 将允许您微调各种键盘参数,其中包括按键重复率(我将我的设置为 15 毫秒,效果很好)。

          【讨论】:

            【解决方案10】:

            我不知道如何加速超越极限,但我知道如何一键跳得更远。我的知识只在 Windows 中,因为我没有 Mac 可以在其中执行此操作。 Ctrl + Arrow 跳过一个单词,根据编辑器的不同,它可能只是跳到下一个空白部分。您也可以使用 Ctrl + Shift + Arrow 来选择任意方向的单词。

            【讨论】:

              【解决方案11】:

              似乎在 Windows 7 上您无法轻松做到这一点。

              当您按住按钮时,速度由 Windows 注册表项控制:HCU->控制面板->键盘->键盘延迟。

              通过将此参数设置为 0,您可以获得最大重复率。戏剧性的是,如果重复速度对你来说仍然很慢,你就不能低于 0。 0-delay表示重复延迟为250ms。但是,250 毫秒的延迟仍然非常慢。看到这个:http://technet.microsoft.com/en-us/library/cc978658.aspx

              您仍然可以访问辅助功能,但您应该知道这些选项是为了帮助残疾人使用他们的键盘,而不是为快速打字的极客提供帮助。他们不会帮忙。他们告诉你,使用 Linux。

              我相信 Windows 的解决方案在于硬件控制。为您的键盘寻找特殊的驱动程序或尝试调整现有的驱动程序。

              【讨论】:

                【解决方案12】:

                虽然这个问题已经有好几年了,但我仍然不时在几个不同的开发者网站上遇到同样的问题。所以我想我可以提供一个替代解决方案,用于我的日常开发人员工作(因为 Windows 注册表设置对我来说从来没有用过)。

                下面是我的小Autorepeat-Script(~125行),可以通过AutoHotkey_L运行(缺点是只能在Windows下运行,至少Vista、7、8.1):

                ; ====================================================================
                ; DeveloperTools - Autorepeat Key Script
                ;
                ; This script provides a mechanism to do key-autorepeat way faster
                ; than the Windows OS would allow. There are some registry settings
                ; in Windows to tweak the key-repeat-rate, but according to widely 
                ; spread user feedback, the registry-solution does not work on all 
                ; systems.
                ;
                ; See the "Hotkeys" section below. Currently (Version 1.0), there
                ; are only the arrow keys mapped for faster autorepeat (including 
                ; the control and shift modifiers). Feel free to add your own 
                ; hotkeys.
                ;
                ; You need AutoHotkey (http://www.autohotkey.com) to run this script.
                ; Tested compatibility: AutoHotkey_L, Version v1.1.08.01
                ; 
                ; (AutoHotkey Copyright © 2004 - 2013 Chris Mallet and 
                ; others - not me!)
                ;
                ; @author   Timo Rumland <timo.rumland ${at} gmail.com>, 2014-01-05
                ; @version  1.0
                ; @updated  2014-01-05
                ; @license  The MIT License (MIT)
                ;           (http://opensource.org/licenses/mit-license.php)
                ; ====================================================================
                
                ; ================
                ; Script Settings
                ; ================
                
                #NoEnv
                #SingleInstance     force
                SendMode            Input 
                SetWorkingDir       %A_ScriptDir%
                
                
                ; Instantiate the DeveloperTools defined below the hotkey definitions
                developerTools      :=  new DeveloperTools()
                
                
                ; ========
                ; Hotkeys
                ; ========
                
                    ; -------------------
                    ; AutoRepeat Hotkeys
                    ; -------------------
                
                    ~$UP::
                    ~$DOWN::
                    ~$LEFT::
                    ~$RIGHT::
                        DeveloperTools.startAutorepeatKeyTimer( "" )
                    return
                
                    ~$+UP::
                    ~$+DOWN::
                    ~$+LEFT::
                    ~$+RIGHT::
                        DeveloperTools.startAutorepeatKeyTimer( "+" )
                    return
                
                    ~$^UP::
                    ~$^DOWN::
                    ~$^LEFT::
                    ~$^RIGHT::
                        DeveloperTools.startAutorepeatKeyTimer( "^" )
                    return
                
                    ; -------------------------------------------------------
                    ; Jump label used by the hotkeys above. This is how 
                    ; AutoHotkey provides "threads" or thread-like behavior.
                    ; -------------------------------------------------------
                    DeveloperTools_AutoRepeatKey:
                        SetTimer , , Off
                        DeveloperTools.startAutorepeatKey()
                    return
                
                
                ; ========
                ; Classes
                ; ========
                
                    class DeveloperTools
                    {
                        ; Configurable by user
                        autoRepeatDelayMs       :=  180
                        autoRepeatRateMs        :=  40
                
                        ; Used internally by the script
                        repeatKey               :=  ""
                        repeatSendString        :=  ""
                        keyModifierBaseLength   :=  2
                
                        ; -------------------------------------------------------------------------------
                        ; Starts the autorepeat of the current captured hotkey (A_ThisHotKey). The given
                        ; 'keyModifierString' is used for parsing the real key (without hotkey modifiers
                        ; like "~" or "$").
                        ; -------------------------------------------------------------------------------
                        startAutorepeatKeyTimer( keyModifierString )
                        {
                            keyModifierLength := this.keyModifierBaseLength + StrLen( keyModifierString )
                
                            this.repeatKey := SubStr( A_ThisHotkey, keyModifierLength + 1 )
                            this.repeatSendString := keyModifierString . "{" . this.repeatKey . "}"
                
                            SetTimer DeveloperTools_AutoRepeatKey, % this.autoRepeatDelayMs
                        }
                
                        ; ---------------------------------------------------------------------
                        ; Starts the loop which repeats the key, resulting in a much faster 
                        ; autorepeat rate than Windows provides. Internally used by the script
                        ; ---------------------------------------------------------------------
                        startAutorepeatKey()
                        {
                            while ( GetKeyState( this.repeatKey, "P" ) )
                            {
                                Send % this.repeatSendString
                                Sleep this.autoRepeatRateMs
                            }
                        }
                    }
                
                1. 将上述代码保存在文本文件 (UTF-8) 中,例如名为“AutorepeatScript.ahk”
                2. 安装 AutoHotkey_L
                3. 双击“AutorepeatScript.ahk”以享受更快的箭头键(或将文件放入您的自动启动文件夹)

                (您可以在脚本中调整重复延迟和速率,请参阅“;可由用户配置”)。

                希望这会有所帮助!

                【讨论】:

                  【解决方案13】:

                  在 Mac 上,使用选项箭头跳过单词,使用 +Shift+箭头 进行选择。 +箭头 跳到一行的结尾或开头,或者文档的结尾或开头。还有向上翻页、向下翻页、主页和结束键 ;) 按住 shift 键也可以选择。

                  【讨论】:

                    【解决方案14】:

                    嗯,这可能很明显,但是:

                    • 对于水平导航,Home(行开始),End(行结束),Ctrl-Left(单词左),Ctrl- 正确(正确的词)适用于我认识的所有编辑器

                    • 对于垂直导航,Page Up,Page Down,Ctrl-Home(文本开始),Ctrl-End kbd>(文本结束)也这样做

                    另外(附带说明),我想强制我的 Backspace 和 Delete 键不重复,以便删除(或替换)文本的唯一方法是 first 标记它,然后删除它(或输入替换文本)。

                    【讨论】:

                      【解决方案15】:

                      不要逐个字符地导航。

                      在 Vim 中(请参阅 ViEmu for Visual Studio):

                      • bw -- 上一个/下一个单词
                      • () -- 上一句/下一句(句号分隔的文本)
                      • {} -- 上一段/下一段(空白行分隔的文本部分)
                      • /? -- 将光标移动到找到的文本的上一个/下一个出现处(w/ set incsearch

                      此外,每个动作都有一个数字作为前缀,可以让您指定重复命令的次数,例如:

                      • 20j -- 向下跳 20 行
                      • 3} -- 下三段
                      • 4w -- 向前移动 4 个字
                      • 40G -- 移动到(绝对)第 40 行

                      在编辑器中浏览文本很可能有等效的方法。如果没有,你应该考虑换一个更好的。

                      【讨论】:

                      • 我已经使用 Vim 15 年了,我知道导航的所有语义方式,但我仍然通过键盘重复进行大量导航。 如果你的关键延迟下降到非常低并且你的重复率非常高,这是非常有效的。它不必逐个字符。您可以按住wj&lt;c-u&gt; 等在缓冲区中压缩,同时暂停以计算行数/字数/等。在 Vim 之前,我选择的编辑器是传奇编辑器 Brief,它可以让您将重复率提高到 荒谬 的速度。
                      • @Mud 您可能同意即使是 Visual Studio 中的 Visual Assist 插件也会因原因而使键盘重复率翻倍。我正在使用未安装 X 的笔记本电脑以避免拖延。我花了一个工作日在谷歌上搜索如何使用比 250 慢的延迟来制作 kbdrate。在内核命令行上添加 atkbd.softrepeat=1
                      猜你喜欢
                      • 2018-04-25
                      • 1970-01-01
                      • 2022-01-19
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-06-13
                      • 2014-01-18
                      • 2012-06-25
                      • 2014-08-25
                      相关资源
                      最近更新 更多