Come posso evitare colpi accidentali [Blocco maiuscole], applicando un ritardo di attesa obbligatorio di almeno un secondo?


8

Esiste un modo / utilità per attivare BLOC MAIUSC solo dopo che il tasto è stato premuto per almeno un secondo? Non voglio disabilitarlo completamente, basta prevenire l'attivazione accidentale di questa funzione.

AutoHotkey può essere programmato per fare questo?


Questo dipenderà dal sistema operativo, quindi aggiungi un tag OS.
Richard,

1
Sarebbe una bella caratteristica.
Moab,

Risposte:


3

Questo può effettivamente essere fatto con un timer-script AHK. Questo script verrà registrato quando viene premuto Caps Lock e intercetta Capslock Up , consentendogli di attivarsi solo se è passato un certo numero di millisecondi. Il timeout predefinito è 0,2 secondi, può essere configurato nella barra delle applicazioni.

; 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

3

Ho due script AHK qui. Se vuoi che ti spieghi oltre a quello che ho commentato negli script, aggiungi un commento qui sotto.

Il primo è più complesso e probabilmente soggetto a guasti, ma invia CapsLock come letterale pressione dei tasti dopo aver tenuto premuto per un secondo.

Il secondo attiva o disattiva lo stato di "Blocco maiuscole", che potrebbe non essere desiderabile se il motivo per cui si desidera il ritardo è per il tasto di scelta rapida CapsLock di altri programmi.

È possibile configurare il ritardo modificando la Delayvariabile nella seconda riga.


Invia un letterale tasto "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
}

Attiva / disattiva lo stato "Blocco maiuscole":

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

1
Il secondo script funziona esattamente come pubblicizzato. Ho modificato la variabile "delay" a 3000 per aumentare il tempo di inattività della pressa a 3 secondi.
Journeyman Geek


0

Trovo una vecchia utility (v1.0, datata gennaio 2001) chiamata "Toggler" che funziona meglio per me, anche se a volte sembra disabilitata in Windows 10. Mi consente di aggiungere un ritardo a CapsLock con una funzione SmartShift per disinserire CapsLock se si premono il tasto Maiusc e una lettera. Ha molte altre funzionalità che non utilizzo.

Nota dell'editore: sembra che lo sviluppatore, Aestas Software, potrebbe non essere più in circolazione e il software non sembra essere stato aggiornato dal 2001. Tuttavia, è ancora scaricabile dal sito http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.