Como evito acessos acidentais [Caps Lock], impondo um atraso de retenção obrigatório de um segundo ou mais?

8

Existe uma maneira / utilitário para ativar o CAPS LOCK somente após a tecla ter sido pressionada por um segundo ou mais? Eu não quero desativá-lo completamente, apenas evite a ativação acidental desta função.

O AutoHotkey pode ser roteirizado para fazer isso?

    
por Borek Bernard 18.02.2011 / 10:37

4 respostas

3

Isso pode ser feito com um script de timer do AHK. Este script será registrado quando Caps Lock for pressionado e interceptará Capslock Up , permitindo que ele seja disparado somente se um determinado número de milissegundos passar. O tempo limite padrão é de 0,2 segundos, 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
    
por 26.03.2013 / 11:33
3

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

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

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

Você pode configurar o atraso alterando a variável Delay 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
}

Ativa 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
}
    
por 26.03.2013 / 11:39
1

Uma pesquisa no google me deu esse link para http://chuchuva.com/software/capslockdelay/ . o o primeiro dos três links de download ainda funciona.

Eu não sei sobre o script AutoHotKey. Talvez pesquise no Google por AutoHotKey e atrasos no caplock.

    
por 18.02.2011 / 12:06
0

Eu acho um utilitário antigo (é v1.0, datado de janeiro de 2001) chamado "Toggler" funciona melhor para mim, embora ocasionalmente parece tornar-se desativado no Windows 10. Isso me permite adicionar um atraso ao CapsLock com uma função SmartShift para remover o CapsLock se a tecla Shift e uma letra forem pressionadas. Ele tem muitos outros recursos que eu não uso.

Nota do editor: Parece que o desenvolvedor, Aestas Software, pode não estar mais disponível, e o software não parece ter sido atualizado desde 2001. No entanto, ele ainda pode ser baixado em link

    
por 19.03.2017 / 05:28