Bagaimana saya mencegah hit [Caps Lock] yang tidak disengaja, dengan memberlakukan penundaan penahanan wajib sedetik atau lebih?

8

Apakah ada cara / utilitas untuk mengaktifkan CAPS LOCK hanya setelah kunci ditekan selama satu detik atau lebih? Saya tidak ingin sepenuhnya menonaktifkannya, hanya mencegah aktivasi yang tidak disengaja dari fungsi ini.

Bisakah AutoHotkey dibuat skrip untuk melakukan ini?

Borek Bernard
sumber
Ini akan tergantung pada OS, jadi harap tambahkan tag OS.
Richard
1
Itu akan menjadi fitur yang bagus.
Moab

Jawaban:

3

Ini memang bisa dilakukan dengan skrip timer AHK. Skrip ini akan mendaftar ketika Caps Lock ditekan dan mencegat Capslock Up , yang memungkinkannya untuk diaktifkan hanya jika sejumlah milidetik telah berlalu. Batas waktu default adalah 0,2 detik, ini dapat dikonfigurasi dalam baki sistem.

; 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
Ярослав Рахматуллин
sumber
3

Saya punya dua skrip AHK di sini. Jika Anda ingin saya menjelaskan lebih jauh dari apa yang saya komentari dalam skrip, silakan tambahkan komentar di bawah ini.

Yang pertama lebih kompleks dan mungkin cenderung gagal, tetapi mengirimkan CapsLock sebagai penekanan tombol literal setelah ditahan selama satu detik.

Yang kedua mengubah status "Caps Lock", yang mungkin tidak diinginkan jika alasan Anda ingin penundaan itu untuk tombol pintas CapsLock beberapa program lain.

Anda dapat mengkonfigurasi penundaan dengan mengubah Delayvariabel di baris kedua.


Mengirim penekanan tombol 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
}

Mengalihkan status "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
}
Bob
sumber
1
Script kedua bekerja persis seperti yang diiklankan. Saya mengubah variabel "delay" menjadi 3000 untuk meningkatkan waktu tekan ke 3 detik.
Journeyman Geek
0

Saya menemukan sebuah utilitas lama (ini v1.0, tertanggal Jan 2001) yang disebut "Toggler" paling cocok untuk saya, meskipun kadang-kadang tampaknya menjadi dinonaktifkan di bawah Windows 10. Ini memungkinkan saya untuk menambahkan penundaan ke CapsLock dengan fungsi SmartShift untuk. batalkan CapsLock jika tombol Shift dan huruf ditekan. Ini memiliki banyak kemampuan lain yang tidak saya gunakan.

Catatan editor: Sepertinya pengembang, Aestas Software, mungkin tidak ada lagi, dan perangkat lunak tersebut tampaknya tidak diperbarui sejak 2001. Namun, masih dapat diunduh di http://download.cnet.com/Toggler /3000-2072_4-10054498.html

Joe Aiken
sumber