如何通过强制保持一秒或更长时间的延迟来防止意外按下 [Caps Lock]?

如何通过强制保持一秒或更长时间的延迟来防止意外按下 [Caps Lock]?

是否有方法/实用程序,仅在按住该键一秒钟或更长时间后才激活 CAPS LOCK?我不想完全禁用它,只是防止意外激活此功能。

可以编写脚本来执行此操作吗?

答案1

这确实可以通过 AHK 计时器脚本来实现。此脚本将记录 Caps Lock 被按下的情况并进行拦截大写锁定,允许它仅在经过一定毫秒数后触发。默认超时时间为 0.2 秒,可在系统托盘中配置。

; AutoHotKey - Suppress CapsLock
; This is a modified version of a scrpt by Lexikos, taken from:
; http://www.autohotkey.com/board/topic/82509-software-fix-for-double-clicking-mouse/

RegRead minDelay, HKCU, Software\LongCapsLock, MinDelay
if ErrorLevel
    minDelay := 200  ; Default setting.

#NoTrayIcon  ; Hide initial icon.
Menu Tray, Icon, %A_WinDir%\System32\main.cpl  ; Set icon.
Menu Tray, Icon  ; Show icon.
Menu Tray, NoStandard
Menu Tray, Add, &Configure, TrayConfigure
Menu Tray, Add, E&xit, TrayExit
Menu Tray, Default, &Configure
Menu Tray, Click, 1  ; Single-click to configure.
Menu Tray, Tip, Long CapsLock

global _starttime
global timing := 0

CapsLock::
if (timing = 0) {
    timing := 1
    _startTime := A_TickCount
}
return

CapsLock Up::
if (timing = 1) {
    _timeDiff := A_TickCount - _startTime
    ;MsgBox  diff: %_timeDiff%
    if (_timeDiff > minDelay) {
        Send {CapsLock down} 
    }
    timing := 0
}
return

TrayConfigure:
prompt := "Enter minimum duration needed to hold Caps Lock`n"
            . "before it is toggled. The unit is milliseconds."
Loop {
    InputBox newMinDelay, Long CapsLock, %prompt%,,,,,,,, %minDelay%
    if ErrorLevel  ; Cancelled?
        return
    if (newMinDelay+0 >= 150 && newMinDelay <= 10000) ; Valid?
        break
    if (A_Index = 1)
        prompt .= "`n`nPlease enter a number between 150 and 10000."
}
minDelay := newMinDelay
if (minDelay = 200)
    RegDelete HKCU, Software\LongCapsLock
else
    RegWrite REG_DWORD, HKCU, Software\LongCapsLock, MinDelay, %minDelay%
return

TrayExit:
ExitApp

答案2

我这里有两个 AHK 脚本。如果您希望我进一步解释脚本中注释的内容,请在下面添加评论。

第一个更复杂,也更容易失败,但它在按住一秒钟后将 CapsLock 作为文字按键发送。

第二个切换“Caps Lock”的状态,如果您想要延迟的原因是为了其他程序的 CapsLock 热键,那么这可能不是理想的选择。

Delay您可以通过改变第二行的变量来配置延迟。


发送文字“CapsLock”按键

; Time to wait in milliseconds
Delay = 1000

; Variable used to ignore key repeats
; (Windows sends them when a key is held down)...
CapsLockHeld = 0

; This starts the timer on key *down*.
; Time is measured in milliseconds.
; Timer resolution should be approximately 20 ms.
; The negative time means run only once.
; It will reset the timer if it is already running.
CapsLock::CapsLockDown()

; This stops the timer on key *up*.
CapsLock Up::CapsLockUp()

; This sends a CapsLock keypress when the timer runs out.
SendCapsLock:
    SetTimer, SendCapsLock, Off
    HotKey, CapsLock, Off
    HotKey, CapsLock Up, Off
    SendInput, {CapsLock}
    HotKey, CapsLock Up, On
    HotKey, CapsLock, On
Return

; Using functions because otherwise global variables die
CapsLockDown() {
    global CapsLockHeld
    global Delay
    If (CapsLockHeld == 1) {
        Return
    }
    CapsLockHeld = 1
    SetTimer, SendCapsLock, %Delay%
    Return
}

CapsLockUp() {
    global CapsLockHeld
    CapsLockHeld = 0
    SetTimer, SendCapsLock, Off
    Return
}

切换“大写锁定”状态:

; Time to wait in milliseconds
Delay = 1000

; Variable used to ignore key repeats
; (Windows sends them when a key is held down)...
CapsLockHeld = 0

; This starts the timer on key *down*.
; Time is measured in milliseconds.
; Timer resolution should be approximately 20 ms.
; The negative time means run only once.
; It will reset the timer if it is already running.
CapsLock::CapsLockDown()

; This stops the timer on key *up*.
CapsLock Up::CapsLockUp()

; This sends a CapsLock keypress when the timer runs out.
SendCapsLock:
    SetTimer, SendCapsLock, Off
    If (GetKeyState("CapsLock", "T"))
        SetCapsLockState, Off
    Else
        SetCapsLockState, On
Return

; Using functions because otherwise global variables die
CapsLockDown() {
    global CapsLockHeld
    global Delay
    If (CapsLockHeld == 1) {
        Return
    }
    CapsLockHeld = 1
    SetTimer, SendCapsLock, %Delay%
    Return
}

CapsLockUp() {
    global CapsLockHeld
    CapsLockHeld = 0
    SetTimer, SendCapsLock, Off
    Return
}

答案3

谷歌搜索给了我这个链接至 http://chuchuva.com/software/capslockdelay/。 这 三个下载链接中的第一个仍然有效。

我不知道 AutoHotKey 脚本。也许可以谷歌搜索 AutoHotKey 和 caplock 延迟。

答案4

不久前我在这里发布了一个 AHK 脚本,看起来好像可以工作,但令人抓狂的是,Caps Lock 总是被意外激活,尽管我已经映射了它并关闭了 Shift-Caps Lock。这个脚本可以解决这个问题。

我厌倦了使用 AutoHotKey 的依赖时间的解决方案,但偶尔,我确实想输入很多大写字母;所以我不想禁用它。我编写的任何脚本都无法阻止它因某些神秘的意外组合而打开(在早期的 M$ ergo kb 上),所以我决定将它映射到我从未使用过的按键。以下将其重新映射到 <Ctrl-Pause/Break>。该按键组合通常不执行任何操作,但使用以下脚本会打开。您可以将触发 CapsLock 的键更改为您喜欢的任何键。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
#NoTrayIcon
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; Disable CapsLock and Shift-CapsLock combinations
CapsLock::
+CapsLock::
+^CapsLock::
^CapsLock::

; Uncomment the following lines to also disable the Left Windows Key
;LWin::
;return

; Define the Ctrl-Pause/Break shortcut
^CtrlBreak::
SetCapsLockState % !GetKeyState("CapsLock", "T")
return

我不希望它干扰 Pause/Break 键的正常使用(在 Windows 中几乎不起作用)。您也可以使用 AutoHotKey 将其编译为紧凑的 .exe。我很快发现 Shift、Ctrl 和 CapsLock 的其他组合也会触发 CapsLock,但在代码中修复它并使用几天后,它运行完美。我不确定完全禁用 AHK 中的 CapsLock 键是否也会在由另一个键组合触发时禁用 CapsLock 状态,所以我只是捕捉这些 CapsLock 触发组合。我已经不再有错误的 CapsLock 触发,但 CAPS LOCK 仍然很容易获得 ;}

相关内容