Как предотвратить случайные попадания [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
Второй скрипт работает именно так, как рекламируется. Я изменил переменную «delay» на 3000, чтобы увеличить время нажатия до 3 секунд.
подмастерье Компьютерщик
1

Поиск в Google дал мне эту ссылку на http://chuchuva.com/software/capslockdelay/ . Первый из трех ссылок для загрузки все еще работает.

Я не знаю о скрипте AutoHotKey. Может быть, Google для AutoHotKey и задержки блокировки.

Darokthar
источник
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

Джо Айкен
источник