My video player application discards keystrokes sent too quickly so I made this.
DelaySend(Key, Interval=200, SendMethod="Send")
Code:
DelaySend(Key, Interval=200, SendMethod="Send") {
static KeyStack := []
KeyStack[Key] := IsObject(KeyStack[Key]) ? KeyStack[Key] : {base: {LastTickCount: 0}}
ObjInsert( KeyStack[Key], { Key: Key, Interval: Interval, SendMethod: SendMethod })
Gosub, Label_DelaySend
Return
Label_DelaySend:
For Key in KeyStack {
if !(MinIndex := KeyStack[Key].MinIndex())
Continue
Span := A_TickCount - KeyStack[Key].LastTickCount
if (Span < KeyStack[Key][MinIndex].Interval) ;loaded too early
SetTimer,, % -1 * (KeyStack[Key][KeyStack[Key].MinIndex()].Interval - Span)
else {
SendMethod := KeyStack[Key][MinIndex].SendMethod
SendingKey := KeyStack[Key][MinIndex].Key
if (SendMethod = "SendInput")
SendInput, % SendingKey
Else if (SendMethod = "SendPlay")
SendPlay, % SendingKey
Else if (SendMethod = "SendRaw")
SendRaw, % SendingKey
Else if (SendMethod = "SendEvent")
SendEvent, % SendingKey
Else
Send, % SendingKey
ObjRemove(KeyStack[Key], MinIndex) ;decrement other elements
if KeyStack[Key].MinIndex() ;if there is a next queue
SetTimer,, % -1 * KeyStack[Key][KeyStack[Key].MinIndex()].Interval
KeyStack[Key].base.LastTickCount := A_TickCount
}
}
Return
}
Examples: Code:
$a::DelaySend("a", 1500)
$s::DelaySend("s", 500)
$d::DelaySend("d", 200, "SendInput")
Code:
^Right::DelaySend("{Media_Next}", 500)
^Left::DelaySend("{Media_Prev}", 500)
It requires AutoHotkey_L. 1.1.01 or later. The details are found in the links.