¿Cómo evito los golpes accidentales [Bloq Mayús], aplicando un retraso de retención obligatorio de un segundo o más?

8

¿Hay alguna forma / utilidad para activar BLOQ MAYÚS solo después de mantener presionada la tecla durante un segundo o más? No quiero deshabilitarlo por completo, solo evitar la activación accidental de esta función.

¿Se puede crear una secuencia de comandos de AutoHotkey para hacer esto?

Borek Bernard
fuente
Esto dependerá del sistema operativo, así que agregue una etiqueta del sistema operativo.
Richard
1
Esa sería una buena característica.
Moab

Respuestas:

3

De hecho, esto se puede hacer con un script de temporizador AHK. Esta secuencia de comandos se registrará cuando se presione Bloq Mayús e interceptará el Bloqueo de mayúsculas , permitiéndole disparar solo si ha pasado un cierto número de milisegundos. El tiempo de espera predeterminado es de 0.2 segundos, esto se puede configurar en la bandeja del 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
Ярослав Рахматуллин
fuente
3

Tengo dos guiones AHK aquí. Si desea que le explique más de lo que he comentado en los scripts, agregue un comentario a continuación.

El primero es más complejo y probablemente propenso a fallas, pero envía CapsLock como una pulsación de tecla literal después de mantenerlo presionado durante un segundo.

El segundo alterna el estado de "Bloqueo de mayúsculas", que puede no ser deseable si la razón por la que desea el retraso es por la tecla de acceso rápido de Bloqueo de mayúsculas de otro programa.

Puede configurar el retraso cambiando la Delayvariable en la segunda línea.


Envía una pulsación de tecla literal "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
}

Alterna el estado "Bloqueo de mayúsculas":

; 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
}
Beto
fuente
1
El segundo script funciona exactamente como se anuncia. Modifiqué la variable de "retraso" a 3000 para aumentar el tiempo de prensado a 3 segundos.
Journeyman Geek
0

Encuentro que una utilidad antigua (es v1.0, con fecha de enero de 2001) llamada "Toggler" funciona mejor para mí, aunque ocasionalmente parece estar deshabilitada en Windows 10. Me permite agregar un retraso a CapsLock con una función SmartShift para deshabilite el Bloqueo de mayúsculas si se presionan la tecla Mayús y una letra. Tiene muchas otras capacidades que no uso.

Nota del editor: Parece que el desarrollador, Aestas Software, ya no está disponible, y el software no parece haber sido actualizado desde 2001. Sin embargo, todavía se puede descargar en http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Joe Aiken
fuente