Como evito acertos acidentais no [Caps Lock], impondo um atraso de espera obrigatório de um segundo ou mais?

8

Existe uma maneira / utilitário para ativar o CAPS LOCK somente depois que a tecla for pressionada por um segundo ou mais? Não quero desativá-lo completamente, apenas evite a ativação acidental dessa função.

AutoHotkey pode ser script para fazer isso?

Borek Bernard
fonte
Isso depende do sistema operacional, portanto, adicione uma etiqueta do sistema operacional.
Richard
1
Isso seria um bom recurso.
Moab

Respostas:

3

Isso pode realmente ser feito com um script de timer AHK. Esse script será registrado quando o Caps Lock for pressionado e interceptará o Capslock Up , permitindo que ele seja acionado apenas se um certo número de milissegundos tiver passado. O tempo limite padrão é 0,2 seg. Isso pode ser configurado na bandeja do sistema.

; 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
Ярослав Рахматуллин
fonte
3

Eu tenho dois scripts AHK aqui. Se você quiser que eu explique além do que eu comentei nos scripts, adicione um comentário abaixo.

O primeiro é mais complexo e provavelmente propenso a falhas, mas envia o CapsLock como um pressionamento de tecla literal depois de manter por um segundo.

O segundo alterna o estado de "Caps Lock", o que pode não ser desejável se a razão pela qual você deseja o atraso for a tecla de atalho CapsLock de outro programa.

Você pode configurar o atraso alterando a Delayvariável na segunda linha.


Envia um pressionamento de tecla "CapsLock" literal

; 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
}

Alterna o estado "Caps Lock":

; 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
}
Prumo
fonte
1
O segundo script funciona exatamente como anunciado. Alterei a variável "delay" para 3000 para aumentar o tempo de inatividade da impressora para 3 segundos.
Journeyman Geek
0

Encontro um utilitário antigo (versão 1.0, de janeiro de 2001), chamado "Toggler", que funciona melhor para mim, embora às vezes pareça estar desativado no Windows 10. Ele permite adicionar um atraso ao CapsLock com uma função SmartShift para desative o CapsLock se a tecla Shift e uma letra forem pressionadas. Possui muitos outros recursos que não uso.

Nota do editor: Parece que o desenvolvedor, Aestas Software, pode não estar mais por perto, e o software não parece ter sido atualizado desde 2001. No entanto, ainda pode ser baixado em http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Joe Aiken
fonte