Use este script AutoHotkey ligeiramente modificado da resposta de Elliot DeNolf :
~Shift::
duration := 0
If (GetKeyState("Shift","p"))
{
start := A_TickCount
While (GetKeyState("Shift"))
Sleep, 1
duration := A_TickCount - start
}
if (duration < 100) ;Change this value as needed
if GetKeyState("CapsLock", "T") = 1
{
SetCapsLockState, off
}
else if GetKeyState("CapsLock", "T") = 0
{
SetCapsLockState, on
}
Return
Se a tecla Shift for pressionada por menos de 100 milisegundos e liberada, ela alternará a tecla CapsLk . Mais de 100 mseg e atuará como uma tecla modificadora normal.
Se 100 mseg for muito longo, escolha um valor apropriado na condição if
.