動機
- ループのたびになんか停止して、なんかのキー/マウス入力で進行するスクリプトを書きたい
KeyWait
基本的にやりたいことはコレ。こっちからの入力を待って進めてくれってこと。
sample.ahk
Loop, 10 ; 10回繰り返し
{
Msgbox, , %A_scriptname%, %A_index%回目
Keywait, RControl ; 右Ctrlを押すと進む
}
Exit
ただし、いくつか問題がある。
- コンビネーションキーが使えない
- 複数の選択肢を用意できない
Input
「複数の選択肢を用意できない」については、Input
コマンドで対応できなくもない。
Input, , , abc,
とかね。
どっこい、これだとコンビネーションキーは使えないし、どころかマウス入力さえ使えない。ちゃうねん
ホットキー
そうなると、トリガーはホットキー(orホットストリング)で作るしかない。
問題は、Loop
ブロックの外部にあるホットキーラベルで、どのように干渉するか。
最初は、Sleep
とラベルを組み合わせてどうにかならんかと考えた。
sample.ahk
Loop, 10 ; 10回繰り返し
{
Msgbox, , %A_scriptname%, %A_index%回目
Sleep, 300000 ; 適当にスリープ
Trigger:
}
ExitApp
Rbutton & LButton:: ; マウス右ボタン押しながら左クリック
^j::
Goto, Trigger
Return
しかし、実行すると「Error: A Goto/Gosub must not jump into a block that doesn't enclose it.」=Goto/Gosubでブロック内に飛ぶ場合はそれ自体がブロック内に含まれてないとダメだよーときた。そりゃそうか。
じゃあHotkey
コマンド使ってループ内で動的定義したるわと思ったが、Sleep
中にホットキーが利かなかった。
sample.ahk
Loop, 10 ; 10回繰り返し
{
Msgbox, , %A_scriptname%, %A_index%回目
hotkey, ^j, cont
Sleep, 3000 ; 適当にスリープ
cont:
Continue
}
ExitApp
となると、停止/再開をなんか別の方法で処理する必要がある。
……Pause
か。
sample.ahk
Loop, 10 ; 10回繰り返し
{
Msgbox, , %A_scriptname%, %A_index%回目
Pause, on ; スクリプトの実行を停止
}
ExitApp
Rbutton & LButton:: ; マウス右ボタン押しながら左クリック
^j::
Pause, off ; スクリプトの実行を再開
Return
これでいけた。