HTAを使ってAutomation AnywhereでBot実行中に字幕を表示する

# 作ることになったキッカケ
RPAを使ったデモやデモ動画を作るときがしばしばあるのですが、
標準に備わっているMessage Boxでは文字が小さく分かりづらいため、
動画編集ソフトで入れるような字幕をBot側で生成できるようにしてみました。

HTA（HTML Applications）という結構古めの技術を使った方法ですので、いつまで使えるかわからないところが不安なところです。

## 参考にしたページ

[HTML Applications その１ - Qiita](https://qiita.com/tnakagawa/items/e049fa1bdd8829315a90)
[HTAで実行時引数取得-Idea to Code-](http://ideatocode.jp/HTA/get_params/)
[HTA固有のタグ[HTA:APPLICATION] - bnote](https://www.bnote.net/windows/wsh/hta_tag.shtml)

## 試した環境
Automation Anywhere Enterprise 11.3.2 日本語版
Windows 10 Professional
画面解像度：1920x1080 （倍率100%)

# おおまかな流れ 
1. HTAファイルを作成
2. 字幕ウィンドウを閉じるTaskを作成
3. 使う

# つくり方
## HTAファイルを作成

はい、ここが一番大変でしたが、皆さんご安心ください。
完成したものを貼っておきます。
画面解像度を自動的に認識するような機能は実装していないので、環境やお好みで中身を書き換えてください。

テキストエディタで**.htaといった形式で、空のhtaファイルを作成し、以下のコードを貼りつけて保存。

```
<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Subtitle</title>
    <HTA:APPLICATION
		ID="oHTA"
		APPLICATIONNAME="mysubtitle"
        BORDER="none"
        BORDERSTYLE="normal"
        CAPTION="no"
        CONTEXTMENU="yes"
		SCROLL="no"
        ICON="./icon.ico"
        INNERBORDER="no"
        MAXIMIZEBUTTON="no"
        MINIMIZEBUTTON="no"
        SHOWINTASKBAR="no"
    />
	<SCRIPT LANGUAGE="VBScript">
    Sub Window_OnLoad
        Window.ResizeTo 1600,170  '字幕表示するウィンドウのサイズを指定。画面の解像度、お好みにより調整してください。
		WindowLeft = (window.screen.availWidth - window.screen.availWidth)   '字幕を表示するウィンドウのX軸の位置を変数に格納
		WindowBottom = (window.screen.availHeight - 165)   '字幕を表示するウィンドウのY軸の位置を変数に格納。好みで調整してください。
		window.moveTo WindowLeft, WindowBottom    '変数に格納した値を元に、字幕を表示するウィンドウを移動

        full_str = oHTA.commandLine  'コマンドラインの文字列取得
        str_start = 1    'パスの先頭
        str_end = InStr(2, full_str, """")  'パスの末尾
        str_end = str_end + 1  'パスの直後のスペース分加算
        m = Mid(full_str, str_start, str_end)  'パス部分を取得
        param_str = replace(full_str, m, "")  'パス部分を削除
		dim oText
		Set oText = document.GetElementById("body")    'idを元に文字列を入れ替えたい部分を指定
		oText.innerText = param_str    'パス部分を削除した文字列（つまりはコマンドラインで指定したパラメーター部分=字幕に出したい文字）をHTMLの本文に書き出し。
      End Sub
</SCRIPT>
</head>
<body style="background-color:#444;color:orange;font-family:meiryo"><center>
<DIV id="body" Style = "font-size:56px"></DIV>
</body></center></html>
```

## 字幕ウィンドウを閉じるTaskを作成
上記のhtaは見た目重視のため、「閉じる」ボタンを含むタイトルバーを非表示にしています。
そのため、字幕ウィンドウを閉じる際にはプログラム的に直接閉じてあげる必要があります。
今回はAutomation Anywhere EnterpriseのClose Windowコマンドを使いました。
HTAファイル内の以下の部分で設定した名前が字幕ウィンドウのウィンドウ名になります。
`<title>Subtitle</title>`
以下のようなTaskを作成してください。Delayの秒数や有無はお好みで。
何らかの理由で上手く閉じれなかったウィンドウが残る場合を想定して、Loopを使ってSubtitleというウィンドウ名のウィンドウがあったら全て閉じるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/85831b61-f8b4-31e7-7563-06ac28875235.png)

## 使う

###字幕を表示する
Open Program/Fileで作成したHTAファイルを呼び出すことで、字幕ウィンドウを表示します。
ステップ 3:パラメータ(任意) に入力した文字列を字幕として表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/fe976617-7481-edfb-bfaa-626fe8ab28b3.png)

### 字幕を消す
先ほど作った字幕ウィンドウを閉じるTaskをRun Taskで実行。
Botのコマンドリストの中のどこに配置するかなどは工夫がいるかもしれません。

## 完成！！
こんな感じで表示されます。
![ED5oMSvUcAI7dS0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/2845223f-0fc0-17bd-1086-b088a474126c.jpeg)


# 把握している課題、不便なところ
- 字幕ウィンドウは特に「常に最前面に表示」みたいな設定にしていないため、字幕が裏側に回って見えなくなってしまうことがある
- 「常に最前面に表示」はHTAの機能としては実装できない。Excelの機能を借りて実現できるが、表示が遅くて今回の用途には合わなかった
- Bot側からすると字幕ウィンドウがActiveなWindowという認識になってしまう可能性があり、Bot側のWindow指定を少し配慮する必要がある（既存のBotに組み込む際など）
- Close Windowコマンドで字幕ウィンドウを閉じるとき、一瞬字幕ウィンドウがActiveになり、裏に隠れてた状態だったりすると、消えた字幕がまた一瞬出てしまって見栄えが悪い。（別の方法で閉じたらそうならないかな？）
- 改行が入れられない仕様