Jak zapobiec przypadkowym trafieniom [Caps Lock], wymuszając obowiązkowe opóźnienie wstrzymania na sekundę lub dłużej?

8

Czy istnieje sposób / narzędzie do aktywacji CAPS LOCK dopiero po przytrzymaniu klawisza przez jedną sekundę lub dłużej? Nie chcę go całkowicie wyłączać, tylko zapobiegam przypadkowej aktywacji tej funkcji.

Czy można w tym celu napisać skrypt AutoHotkey?

Borek Bernard
źródło
Będzie to zależne od systemu operacyjnego, więc dodaj tag OS.
Richard
1
To byłaby fajna funkcja.
Moab

Odpowiedzi:

3

Można to rzeczywiście zrobić za pomocą skryptu czasowego AHK. Ten skrypt zostanie zarejestrowany po naciśnięciu klawisza Caps Lock i przechwyci Capslock Up , umożliwiając jego uruchomienie tylko po upływie określonej liczby milisekund. Domyślny limit czasu to 0,2 sekundy, można to skonfigurować w zasobniku systemowym.

; 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
Ярослав Рахматуллин
źródło
3

Mam tutaj dwa skrypty AHK. Jeśli chcesz, żebym wyjaśnił dalej niż to, co skomentowałem w skryptach, dodaj komentarz poniżej.

Pierwszy jest bardziej złożony i prawdopodobnie podatny na awarię, ale wysyła CapsLock jako dosłowne naciśnięcie klawisza po przytrzymaniu przez sekundę.

Drugi przełącza stan „Caps Lock”, co może nie być pożądane, jeśli powodem opóźnienia jest klawisz skrótu CapsLock innego programu.

Możesz skonfigurować opóźnienie, zmieniając Delayzmienną w drugim wierszu.


Wysyła dosłowne naciśnięcie klawisza „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
}

Przełącza stan „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
}
Kok
źródło
1
Drugi skrypt działa dokładnie tak, jak w reklamie. Zmieniłem zmienną „opóźnienie” na 3000, aby zwiększyć czas docisku do 3 sekund.
Journeyman Geek
0

Uważam, że stare narzędzie (wersja 1.0, datowana na styczeń 2001 r.) O nazwie „Toggler” działa najlepiej dla mnie, chociaż czasami wydaje się być wyłączone w systemie Windows 10. Pozwala mi dodać opóźnienie do CapsLock z funkcją SmartShift, aby wyłącz CapsLock, jeśli zostanie naciśnięty klawisz Shift i litera. Ma wiele innych możliwości, których nie używam.

Uwaga edytora: Wygląda na to, że programista, Aestas Software, może już nie być w pobliżu, a oprogramowanie nie wydaje się być aktualizowane od 2001 roku. Jednak nadal można je pobrać ze strony http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Joe Aiken
źródło