プログラミング

Windows 10 WSL bashとAutohotkeyで複数の位置を同時にクリックする

Windows 10 WSL bashとAutohotkeyで複数の位置を同時にクリックする方法について紹介します。
bashとAutohotkeyで複数の場所を同時にクリックするスクリプトを書きましたのでシェア。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_ce8974f5-5f9e-40ed-a32b-7744df1a90fb.gif

マイクとシステム音声を同時に録音したくて、そういうソフトウェアとかなさげだったので複数のソフトウェアで同時にマイクの録音、システムサウンドの録音を同時にする方法を取りました。
そこで、レコーディング開始ボタンを同時にクリックするのに、簡単なツールを作ってみたというところです。

コード


clickPositionsAtSameTime(){

: <<< '

e.g. clickast audacity.exe CHoRoKuF.exe
e.g. clickast audacity.exe audacity.exe
'

# sleepWithDisplay 5

{
# telegram-sendMessage "clickast: Make locate mouse cursor on 'want_to_click_position_1' on audacity.exe" >&/dev/null ; sleep 5s ; \
# telegram-sendMessage "clickast: Make locate mouse cursor on 'want_to_click_position_2' on CHoRoKuF.exe" >&/dev/null &
# telegram-sendMessage "clickast: locate mouse cursor on the position 01 on audacity.exe" >&/dev/null ; sleep 5s ; \
# telegram-sendMessage "clickast: locate mouse cursor on the position 02 on CHoRoKuF.exe" >&/dev/null &
: ;
}

cat << EOT > /mnt/c/_tmp/tmp.ahk


CoordMode, Mouse, Screen

; telegram-sendMessage here
RunWait, bash.exe -ic 'telegram-sendMessage "clickast: locate mouse cursor on the position 01 on ${1}" >&/dev/null'
sleep 5000
MouseGetPos, want_to_click_position_1_X, want_to_click_position_1_Y
; # RunWait, bash.exe -ic 'telegram-sendMessage "clickast: the position 01 is %want_to_click_position_1_X% / %want_to_click_position_1_Y%" >&/dev/null'
MouseMove, want_to_click_position_1_X + 30, want_to_click_position_1_Y + 30, 0
MouseMove, want_to_click_position_1_X - 30, want_to_click_position_1_Y - 30, 50
MouseMove, want_to_click_position_1_X - 30, want_to_click_position_1_Y + 30, 0
MouseMove, want_to_click_position_1_X + 30, want_to_click_position_1_Y - 30, 50

; telegram-sendMessage here
RunWait, bash.exe -ic 'telegram-sendMessage "clickast: locate mouse cursor on the position 02 on ${2}" >&/dev/null'
sleep 5000
MouseGetPos, want_to_click_position_2_X, want_to_click_position_2_Y
; # RunWait, bash.exe -ic 'telegram-sendMessage "clickast: the position 02 is %want_to_click_position_2_X% / %want_to_click_position_2_Y%" >&/dev/null'
MouseMove, want_to_click_position_2_X + 30, want_to_click_position_2_Y + 30, 0
MouseMove, want_to_click_position_2_X - 30, want_to_click_position_2_Y - 30, 50
MouseMove, want_to_click_position_2_X - 30, want_to_click_position_2_Y + 30, 0
MouseMove, want_to_click_position_2_X + 30, want_to_click_position_2_Y - 30, 50

WinActivate, ahk_exe ${1}
WinWaitActive, ahk_exe ${1}

MouseClick, left,  want_to_click_position_1_X, want_to_click_position_1_Y

sleep 200

WinActivate, ahk_exe ${2}
WinWaitActive, ahk_exe ${2}

MouseClick, left,  want_to_click_position_2_X, want_to_click_position_2_Y

sleep 200

EOT

psl ahk C:/_tmp/tmp.ahk

}

alias clickast="clickPositionsAtSameTime"


## bash

alias psl='/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe'


telegram-sendMessage ()
{
    curl -s -X POST "https://api.telegram.org/${TELEGRAM_API_KEY}/sendMessage" -d chat_id=638365737 -d text="${1:-Hello World}"
}

## powershell

Set-Alias ahk "C:\Program Files\AutoHotkey\AutoHotkeyU64.exe"

これは2つの位置を同時クリックする例ですが、コードをちょちょっと追記すれば3つでも4つでも行けるかと思います。

使い方

clickast audacity.exe CHoRoKuF.exe

解説

添付のgif動画を見てもらえればどういうプロセスなのかわかりやすいかと思いますが、簡単にプロセスを説明しておきます。

デスクトップ通知[xx.exeの位置01にマウスカーソルを載せてください] > 5秒後にマウスカーソルの位置を取得、変数へ保存 > クリック位置の確認としてバツ印を描くようにエフェクトする >
デスクトップ通知[yy.exeの位置02にマウスカーソルを載せてください] > 5秒後にマウスカーソルの位置を取得、変数へ保存 > クリック位置の確認としてバツ印を描くようにエフェクトする >
xx.exeをアクティーベートして位置01をクリックする > 200ms待機(変更可能) > yy.exeをアクティーベートして位置02をクリックする

特筆して難しいことはしていないので、これ以上説明はいらないかと思います。強いて言うなら

MouseMove, want_to_click_position_1_X + 30, want_to_click_position_1_Y + 30, 0
MouseMove, want_to_click_position_1_X - 30, want_to_click_position_1_Y - 30, 50
MouseMove, want_to_click_position_1_X - 30, want_to_click_position_1_Y + 30, 0
MouseMove, want_to_click_position_1_X + 30, want_to_click_position_1_Y - 30, 50

の部分、マウスを動かしてバツ印を描く部分になりますが、どうやってクリック予定位置を知らせることができるだろうか、ということを少し考えたくらいです。

あとは、僕としてはautohotkeyで複雑なことはしたくなかったので、autohotkeyスクリプト内でbashの外部コマンドを実行するのは本望ではなかったのですが – コメントアウトしてある部分がそれです -、これについても少し。
bashからバッググラウンドで実行してautohotkeyの実行に合わせて実行されるようにする、という手法を最初取っていたのですが、これだとautohotkeyの実行が遅いのか、どっかでラグが発生してるようで、ちゃんと予定経過時間どおりに機能しないんですよね。コード自体もダーティーになってしまうこともあり、仕方なくautohotkeyで外部コマンドでやるって方法を取りました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です