3キー同時押しの理屈

テストケースが煮詰まってきたので、一応簡単に理屈を書いておきます。

3キー同時押しが発生する場合、押されるキーの数は1→2→3→2→1と変化します。まず1→2→3と昇順で増えていくのを確認するために関数を作成しました。2キー同時押しの場合です。

test()
{
	If GetKeyState("r","P") and GetKeyState("i","P") and !GetKeyState("j","P"){
		return 1
	}
	Else If GetKeyState("r","P") and GetKeyState("j","P") and !GetKeyState("i","P"){
		return 1
	}
	Else If GetKeyState("i","P") and GetKeyState("j","P") and !GetKeyState("r","P"){
		return 1
	}
}

1キーと3キーの場合も条件が違うだけで理屈は同じです。次に降順で減る場合ですが、文字を出力したあとにポーズをかけるしかありませんでした。単にそのままポーズを再開させると余計な出力も行われますので、再開時にはリロードをかける必要があります。

問題はいつリロードをかけるかですが、ポーズの直後や直前だと成功率に影響が出ます。次の単打入力でリロードすることにしました。

r::
KeyWait,r
getString("し")
If(A_IsPaused>0){
	Reload
}
Return

他にもっといいタイミングあればいいのですが、現状はこうしています。

なぜ先行入力キーを意識する必要があるのか

確証があるわけではないので、あくまで仮説です。

3キー同時押しの後に単打を打つとすると押されるキーの数は
→2→3→2→1→0→
と変化します。太字で示した最初と最後のキーが同一であるとAutoHotkeyは同一の処理だとみなすようです。ポーズがかかっている処理と同じ処理を行うわけですから解除されません。0キーの段階で処理を終了したいのですがどうすればいいかわかりません。

追記

フラグ管理を見直した結果先行入力キーを意識せずともなんとか仕様を満たせそうです。上は理屈の説明として残しておきます。