0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[AutoHotKey]コンビネーションキーとかでKeyWaitしたい

Last updated at Posted at 2018-06-10

動機

  • ループのたびになんか停止して、なんかのキー/マウス入力で進行するスクリプトを書きたい

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

これでいけた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?