まずはじめに…
とあるWindowsPC端末で、常時プログラムを複数動かして装置を外部監視しています。
↑PC画面イメージ図
その状態で常時動かしているのですが、WindowsUpdateが定期的に走って、再起動してしまいます。
そうなると起動後に再ログイン後、プログラム起動⇒良い感じの位置へ配置⇒実行ボタン押して監視起動…これを必要分…とすると手間がかかります。
流石にUpdateを止めておくわけにもいきません…。
個人PCでは、スタートアップとしてメールやチャット、Noteをログイン後自動起動させるぐらいしかやったことがなく知識もないので、GPTさんの力を借りて取り掛かり始めました。
GPTに聞いてみた
『Windows PCが再起動したときに、exeプログラムのツールを複数自動起動させ、指定の位置、指定の大きさになるようにしたい。』
…だいぶざっくりですが、まずはどういうものがあれば実現できるかを確認したかったので、大体のやりたいことを書いて聞いてみました。
その中で出てきたのが『AutoHotkey』でした。
AutoHotkeyって何?
AutoHotkey(AHK)とは、Windows向けのスクリプト言語で、主にキーボードやマウスの操作を自動化するために使われます…(By GPT)
サンプルコードも出してくれましたので、中身を見てみますと…
Run, C:\Path\To\YourProgram.exe
WinWait, YourProgramTitle
WinMove, YourProgramTitle,, X, Y, Width, Height
- 起動プログラムを指定、Runが起動指示
- 次にプログラム名が立ち上がるまで待機?
- その後、起動したら座標X、y位置から、指定の幅と高さにしてくれそう?
…とプログラムちょっとでも触った人なら感覚で分かりそうではありませんか!
少し調べると、起動後、ツール内のボタンを押して実行するもできるとのこと…正にやりたいことですねということで、こちらを使うことにしました。(インストール方法は省略します)
日本語のWikiがありましたので、詳しく知りたい人はこちらへどうそ。
AutoHotkey Wiki
できるようにするためには何が必要か
先ほどのサンプルコードを見ていると、起動するプログラム名とプログラムの(恐らく左上の)X,Y位置と幅と高さの情報が必要と分かりました。
今まさに作業PCで該当ツール起動させてるので…理想形はすでにあり、その理想形から必要な情報が取得できればいいなということで、AutoHotkeyでできないかまたGPTさんに聞いてみました。
AutoHotkeyで作るんだから、AutoHotkeyでPC内の起動中プログラム達の「YourProgramTitle,, X, Y, Width, Height」(sample.ahk)の部分を取得すればそのまま使えるはずですよね…!
ということでうまく情報が取得できなかったり動かなかったりしながらGPTと試行錯誤してできたコードがこちら。
#Persistent
windows := "" ; ウィンドウ情報を格納する変数を初期化
; すべてのウィンドウを取得
WinGet, id, List
; 各ウィンドウの情報を取得
Loop, % id
{
this_id := id%A_Index%
WinGetTitle, title, ahk_id %this_id%
WinGetClass, class, ahk_id %this_id%
; ウィンドウが非表示の場合はスキップ
if (title = "")
continue
; ウィンドウ情報を文字列に追加
WinGetPos, x, y, width, height, ahk_id %this_id%
windows .= "ID: " this_id "`n"
windows .= "タイトル: " title "`n"
windows .= "クラス: " class "`n"
windows .= "X位置: " x ", Y位置: " y ", 幅: " width ", 高さ: " height "`n`n"
}
; スクロール可能なウィンドウを作成
Gui, +Resize
Gui, Add, Edit, vOutput r30 w600 ReadOnly
GuiControl, , Output, % windows ; ウィンドウ情報を表示
Gui, Show, , 起動中のウィンドウ情報
return
GuiClose:
ExitApp
これで、今起動中のツールの配置と大きさを取得してくれるプログラムとなりました。
起動方法は簡単で、ツール起動中のPCにAutoHotkeyをインストールし、作成したプログラムをダブルクリック(或いは右クリック⇒「Run Script」を押下)でプログラム起動します。
試しに、起動した結果が下記となります。
少し試行錯誤した名残で、IDとクラス情報も取得してますが恐らくこれはいらない情報なので削除してもよかったかもと思いつつ、無事にタイトルとX,Y位置、幅と高さの情報が取れてます。
初期は結果情報がコピペできない+1ウィンドウずつ結果を出してくる仕様だったので、テキストに結果貼り付けられるようにコピーできる+結果を全てまとめて表示できるようにしてあります。
下記の図ではすごくきれいに並んでますが、現時点では手動で配置しており、今の取得結果だと微妙になってきます。なので少し微調整して図のようにぴったり配置されるようにしようと画策しています。
できるようにするためには何が必要か②
Run, C:\Path\To\YourProgram.exe
WinWait, YourProgramTitle
WinMove, YourProgramTitle,, X, Y, Width, Height
これで、サンプルコードのように、
- 起動するツールのフルパス
- 取得したツールのタイトルで待機
- 取得したツールのタイトルとその位置情報で指定の位置に動かす
上記を起動したい分まで記載していけば動くはずです…。
ということで、取得した情報をコピーして試しに指定のプログラムを指定の位置に動くかを試したところ、うまくいきました。
気を付ける点としては、最近だと大抵プログラム保存場所のパスやプログラム名自体に日本語が含まれているので、文字コードをUTF-8⇒SJISに変更したぐらいです。
また、モニターを変えると位置情報の取得し直しになってしまうので、そこは気を付けるポイントでしょうか。
と、ここまでが今実行した所となります。
後は実際に動かしてみて整列した際の、実行ボタンの位置情報、そして実行ボタンを押して監視を起動する…というところを今後やっていき、できたら記事にしたいと思います。
お知らせ
こちらの記事はctc Advent Calendar 2024の記事となります。
この後もctc(中部テレコミュニケーション株式会社)のメンバーが技術にまつわる知見を投稿していきますのでご期待ください。