Table of Contents
Se stai leggendo questo articolo, significa che probabilmente stai cercando di risolvere un fastidioso problema che si verifica con molte tastiere meccaniche: scrivi una parola perfettamente normale e ti ritrovi con una lettera doppia non voluta. “questto”, “spazzio”, “helloo”, etc.
Non è sempre colpa delle dita. Spesso è un problema noto come key chatter (o “rimbalzo del tasto”): una singola pressione viene interpretata dal sistema come due pressioni ravvicinate. È un fenomeno fastidioso e ricorrente che può colpire molte tastiere, anche di fascia alta.
Nel mio caso, la tastiera è una Logitech G915 X Lightspeed: ottima per digitazione e gaming, ma soggetta (nel tempo, o in modo intermittente) a episodi di doppia battuta casuale. Volevo una soluzione che fosse:
- Globale (non limitata a pochi tasti)
- Intelligente (che non blocchi la ripetizione quando un tasto viene tenuto premuto)
- Disattivabile automaticamente in certe applicazioni (ad esempio alcuni giochi)
- Configurabile e facile da manutenere
La risposta è stata uno script AutoHotkey v2 che applica un debounce globale alla tastiera, distinguendo tra “doppia pressione involontaria” e “tasto tenuto premuto”.
Cos’è il “debounce” in termini pratici
Quando un tasto “rimbalza”, Windows riceve due eventi di pressione in rapidissima successione. Se ignoriamo il secondo evento quando arriva entro una soglia (ad esempio 150 millisecondi), eliminiamo gran parte delle doppie battute.
La difficoltà è non rovinare l’esperienza d’uso: tenere premuto un tasto deve continuare a funzionare (auto-repeat), altrimenti diventa un disastro in scrittura e in gioco.
Come funziona la mia soluzione
Lo script fa tre cose chiave:
- Intercetta i tasti tramite scancode (copertura ampia, quasi globale).
- Memorizza l’ultima “pressione valida” per ogni tasto e sopprime un secondo tap troppo ravvicinato.
- Traccia lo stato down/up del tasto: se il tasto è già fisicamente premuto, considera i keydown successivi come auto-repeat e li lascia passare.
In pratica:
- Doppio tap involontario → viene bloccato.
- Tasto tenuto premuto → funziona normalmente.
Script completo (AutoHotkey v2) pronto all’uso
Requisiti: AutoHotkey v2 installato. Salva il file come .ahk (es. KeyboardDebounceGlobal.ahk) ed eseguilo.
Cosa puoi configurare:
debounceThreshold→ soglia in millisecondi (parti da 150 e regola in base al caso).ignoreWindows→ elenco di finestre/app dove disattivare automaticamente il debounce.excludedSC→ tasti esclusi dal debounce (qui ho escluso modificatori e anche Backspace/Canc, Insert e Delete).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#Requires AutoHotkey v2.0 #UseHook true ; ========================= ; CONFIG ; ========================= global debounceThreshold := 150 ; millisecondi global lastTap := Map() ; ultimo tap valido per tasto global isDown := Map() ; stato fisico down/up per tasto global ignoreWindows := [ "ahk_exe cs2.exe", "ahk_exe GenshinImpact.exe" ] ; Abilita il debounce solo se la finestra NON è nella ignore list HotIf(WinNotIgnored) ; Escludo i modificatori (consigliato) e alcuni tasti "sensibili" ; Nota: "Canc" nel parlato spesso indica Backspace; su ITA Backspace è SC00E. global excludedSC := Map( ; Modificatori "SC02A", true, ; LShift "SC036", true, ; RShift "SC01D", true, ; LCtrl "SC11D", true, ; RCtrl (extended) "SC038", true, ; LAlt "SC138", true, ; RAlt / AltGr (extended) "SC15B", true, ; LWin (extended) "SC15C", true, ; RWin (extended) "SC00E", true, ; Backspace (spesso chiamato "Canc") "SC152", true, ; Insert "SC153", true ; Delete ) ; ========================= ; HANDLERS ; ========================= DebounceDown(*) { global debounceThreshold, lastTap, isDown hk := A_ThisHotkey sc := RegExReplace(hk, "^\$?\*?") ; "$*SC01E" -> "SC01E" ; Se è già fisicamente down, è auto-repeat: NON debouncare if isDown.Has(sc) && isDown[sc] { Send("{Blind}{" sc "}") return } ; Primo down reale (tap) isDown[sc] := true now := A_TickCount ; Sopprime un secondo tap troppo ravvicinato (bounce) if lastTap.Has(sc) && (now - lastTap[sc] < debounceThreshold) return lastTap[sc] := now Send("{Blind}{" sc "}") } KeyUp(*) { global isDown hk := A_ThisHotkey sc := RegExReplace(hk, "^\$?\*?") ; "$*SC01E up" -> "SC01E up" sc := RegExReplace(sc, "\s+up$") ; "SC01E up" -> "SC01E" isDown[sc] := false } ; ========================= ; HOTKEY GENERATION ; ========================= ; Genera hotkey per gli scancode (copertura ampia) Loop 0xFF { sc := Format("SC{:03X}", A_Index) if excludedSC.Has(sc) continue try { Hotkey("$*" sc, DebounceDown, "On") Hotkey("$*" sc " up", KeyUp, "On") } } ; ========================= ; WINDOW FILTER ; ========================= WinNotIgnored(*) { global ignoreWindows for pattern in ignoreWindows { if WinActive(pattern) return false } return true } |
Installazione rapida
- Installa AutoHotkey v2.
- Crea un file:
KeyboardDebounceGlobal.ahk. - Incolla lo script e salva.
- Esegui il file (icona AHK nell’area di notifica).
- Prova a digitare: se il problema era “chatter”, le doppie battute dovrebbero sparire.
Avvio automatico: se vuoi eseguirlo a ogni accensione, crea un collegamento al file e mettilo nella cartella di avvio di Windows.
Come regolo la soglia (debounceThreshold)
Ogni tastiera (e ogni difetto) è diverso. Io consiglio:
- 150 ms come base (tipicamente efficace).
- 100–120 ms se ti sembra “troppo aggressivo” e mangia doppi tocchi legittimi.
- 180–220 ms se il bounce è severo e qualche doppia battuta passa ancora.
Se noti che sequenze volute come “tt” o “pp” vengono ridotte, abbassa la soglia. Se invece compare ancora qualche doppia lettera fantasma, alzala leggermente.
Escludere applicazioni (utile per giochi)
La lista ignoreWindows disattiva automaticamente il debounce quando una di quelle finestre è attiva. Puoi aggiungere:
"ahk_exe nomeprogramma.exe""ahk_class NomeClasseFinestra"
Così tengo la digitazione pulita in Windows, ma evito qualunque interferenza in software sensibili alla latenza o in giochi specifici.
Limiti e aspettative realistiche
Questa è una soluzione software: non ripara un problema hardware alla radice. Ma se il difetto è intermittente, difficile da “provare” in assistenza, o se vuoi semplicemente allungare la vita di una tastiera che ti piace, è un workaround sorprendentemente efficace.
Nel mio caso, ha trasformato un fastidio ricorrente in qualcosa che non noto più, ed è esattamente quello che volevo.
