ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

ステップ記録ツールからスクリーンショットを取り出す作業を自動化する mht 展開編【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

今回やりたいこと。

mht 展開ツールを起動して、 mht ファイルのパスをダイアログ入力して、展開します。

そこまで自動化できれば、目的はほぼ果たせたと言っても良いです。

さらに期待するのは GIMP の起動です。
なぜなら、ステップ記録ツールのスクリーンショットはスクリーン全体を保存するので、ほとんどの場合トリミングの作業を行うからです。
GIMP を起動して、取り出したスクリーンショットの画像を開いてくれるとありがたい。

実装する。

展開ツールの起動とダイアログ入力。

mht 展開ツールのタイトルおよびファイル名は特徴的なのでウィンドウを捕まえてファイル名およびディレクトリを入力する処理は簡単です。
A_Args変数には起動オプションから渡ってきたデータが入っています。
[0]には渡されたパラメータの数が入っています。
最初のパラメータは[1]で取り出せます。
sendinput で一文字ずつ入力しても良いのですが、送信ミスの恐れもあるのでクリップボードに入れてペーストする形で入力します。

Clipboard := "c:\temp\psr\" . A_Args[1]
Send,^v

ダイアログ mht ファイルのありかを指定してエンターキーを送信すれば展開処理を始まります。
ファイル展開には少々の時間を必要とします。
プログレスバーで残り処理のパーセンテージが表示されます。

展開作業の終了を待つ。

GIMP の起動ですが、その前に展開ツールによるファイル取り出しが完了していることを確認できるまで待たなければなりません。

幸いにも展開ツールは展開が終わると同時に終了します。
展開ツールが閉じられるのを確認できてから次の処理に移行すれば良さそうです。

実行プロセスの生存確認は、次のようにタイトルで指定して 終了まで待ちます。

WinWaitClose, extractMHT

ただし、展開ツールはダイアログでエンターキー送信した後に一度消失してプログレスバーの表示で復活するようです。
そこで念のためにファイル展開中のプログレスバーが存在していることを確認してから終了を待ちます。

WinWait, extractMHT
Sleep, 1000
WinWaitClose, extractMHT

GIMP の起動。

GIMP が起動していない場合は起動させます。
GIMP 起動中であれば、コマンドラインから JPEG ファイルを指定して GIMP を実行することで即座に画像ファイルを開いた状態にできます。
展開されたファイルの中から JPEG ファイルだけを抽出して、全部 GIMP で開けば作業がかなり軽減されます。
JPEG ファイルを拾って開かせる処理はAutoHotkeyよりも Ruby の方が得意なので、 起動確認できたら処理をrubyに任せます。

GIMP も起動に時間がかかるアプリケーションです。
GIMP らしいウィンドウが確認できるまで待機します。
あくまでも GIMP らしいものなので、判定失敗することもあるかもしれません。

    gimpexe = "C:\Program Files\GIMP 2\bin\gimp-2.10.exe"
    Run, %gimpexe%,,pid
    WinWait, GIMP (GNU Image Manipulation Program)

最終的に出来上がったプログラムはこんな感じです。


今後の課題。

起動時のパラメータ取り出しに問題があります。

  • 本来なら渡されたパラメータをチェックすべきです。
  • パラメータが渡されなかった時には使い方を表示した方が良いです。
  • 多く渡ってきた時は警告した方が良いです。
  • 渡されたパラメータのファイルの存在確認をすべきです。

これらのチェックをしないで素通りしてくると、展開処理に失敗する恐れがあります。
また、それ以外の理由も含めて展開処理に失敗した場合でも処理は中断せずに GIMP の起動に移ります。

GIMP の起動処理にも問題があります。

  • GIMP の実行ファイルが見つからない場合には、ファイル不明のメッセージが表示されて処理が中断します。そのメッセージ内容が少々不親切です。
  • GIMP 実行ファイルのバスをプログラム内に埋め込んでいますので、該当バージョンがきっちりインストールされていなければ動きません。

いくつかの課題が指摘されているものの、対応する可能性は低そうです。


この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら