Як запобігти випадковим ударам [Caps Lock], застосувавши примусове затримка утримування на секунду чи більше?


8

Чи є спосіб / утиліта активувати функцію CAPS LOCK лише після утримування клавіші на одну секунду чи більше? Я не хочу повністю його відключати, просто запобігайте випадковій активації цієї функції.

Чи може сценарій AutoHotkey зробити це?


Це буде залежати від ОС, тому додайте тег ОС.
Річард

1
Це було б приємною особливістю.
Моав

Відповіді:


3

Це дійсно можна зробити за допомогою таймера-сценарію AHK. Цей сценарій буде зареєстровано, коли натиснути Caps Lock і перехопить Capslock Up , що дозволить йому запускатись, лише якщо пройшло певну кількість мілісекунд. Тимчасовий час очікування становить 0,2 сек. Це можна налаштувати в системному треї.

; 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

У мене є два сценарії AHK. Якщо ви хочете, щоб я пояснив далі, ніж те, що я коментував у сценаріях, будь ласка, додайте коментар нижче.

Перший складніший і, ймовірно, схильний до відмови, але він надсилає CapsLock як буквальне натискання клавіші після утримування протягом однієї секунди.

Другий перемикає стан "Caps Lock", що може виявитися небажаним, якщо причина, за якою ви хочете затримати, - це гаряча клавіша CapsLock іншої програми.

Ви можете налаштувати затримку, змінивши Delayзмінну у другому рядку.


Надсилає буквальне натискання клавіші "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
}

Перемикає стан "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
}

1
Другий сценарій працює точно так, як рекламується. Я змінив змінну "затримка" до 3000, щоб збільшити час відключення натискання на 3 секунди.
Подорожник Geek

1

Пошук у Google надав мені це посилання на http://chuchuva.com/software/capslockdelay/ . Перший з трьох посилань для завантаження все ще працює.

Я не знаю про сценарій AutoHotKey. Можливо, Google для AutoHotKey та затримки замикання.


4
-1 Не "чудово". Поточна відповідь - це лише посилання, позначене як "посилання", а друга частина - "Я не знаю, спробуйте google".
Той бразильський хлопець

0

Я знаходжу стару утиліту (це v1.0, від січня 2001 р.) Під назвою "Toggler" для мене найкраще працює, хоча час від часу вона стає відключеною під Windows 10. Це дозволяє мені додати затримку до CapsLock з функцією SmartShift до зніміть функцію CapsLock, якщо натиснуто клавішу Shift та літеру. Він має багато інших можливостей, якими я не користуюся.

Примітка редактора: Схоже, розробник, Aestas Software, може більше не існувати, і програмне забезпечення, здається, не оновлювалося з 2001 року. Однак це все ще можна завантажити за адресою http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.