【RPA】メモ帳を実行環境で使っている場合に Windows 10 バージョン1903に移行する際の注意点

# 概要
OSの更新プログラム適用により、時としていままで動いていたRPAロボットの修正が求められることがあります。Windows 7 から Windows 10 のアップグレードくらい大きな変更ではない場合、物事をざっくり把握できる人間にとっては、あまり大した変更ではないことも、少しの仕様変更でも細かく指示を出さないといけないRPAロボットにとっては致命的な変更になることがあります。

2019年5月下旬に配信が始まったWindows 10 May 2019 Update バージョン1903 上 (以下、バージョン1903)では、徐々に対象マシンを広げながらアップデートされるマシンが広がってきています。私も自宅に3台あるWindowsマシンも2019年8月現在、ようやく2台目が対象に入りアップデートを行いました。バージョン1903では、さまざまな[新機能が一覧](https://docs.microsoft.com/ja-jp/windows/whats-new/whats-new-windows-10-version-1903)されていますが、このほかにも細かい変更がたくさん行われています。

### バージョン1903からメモ帳のコンテンツ変更でウィンドウタイトルにマーク(*)がつくようになった
RPAロボットに地味に影響がありそうな仕様変更として、メモ帳の仕様変更があります。メモ帳はバージョン1903から、テキスト変更後にウィンドウタイトルにアスタリスク(*)がつくようになりました。これにより、メモ帳をRPA運用環境で利用しておりコンテンツの変更を行うロボットは修正を迫られる可能性があります。[Automation Anywhere の本体付属のサンプルでは、ロボットが途中で止まってしまう問題](https://qiita.com/RPAbot/items/6fae81d60e23f20fc5c0)が発生しました。

起動直後
![notepad.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/ed173a6a-974c-6d6e-0905-24201ff4167e.png)

テキスト変更後 ("無題"の前にアスタリスク (*) が追加される)
![notepad-edited.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/b457d2d0-0e91-5d48-8664-c5623873222d.png)

# ロボットの修正
ウィンドウタイトルのテキストをマッチングして処理対象のウィンドウを判別している場合に問題が発生します。修正方法としては、このマッチングの条件に、ウィンドウタイトルのテキスト冒頭にアスタリスクが来てもよいように変更を加えることになります。WinActor、UiPath、Automation AnywhereといったRPAソフトウェアで具体的にどう修正すればいいのかを見てみましょう。(その他のソフトウェアも基本的に同じ考え方で修正すればOKなはずです)

サンプルとして、メモ帳を起動し、テキストを2行入力するRPAロボットを想定します。
![notepad-result.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/667ef8a8-5c78-41ec-c2e2-c42fe4b1ef76.png)

### WinActor
![winactor-notepad00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/88423c7d-0d85-046a-4a18-d581fff72bdd.png)

WinActorで作成したフローチャートでは、フローチャート画面の上の「ウィンドウ識別ルール」を使ってウィンドウの識別ロジックを確認できます。
![winactor-notepad01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/775d131e-b944-011d-863c-5984a2289aa1.png)

WinActorではウィンドウの識別方法として「**ウィンドウタイトル**」「**ウィンドウクラス名**」「**プロセス名**」「**ウィンドウサイズ**」といった4通りの方法を利用できます。

ウィンドウタイトルで識別している場合は、「**指定しない**」にするか、「**を含む**」「**で終わる**」を指定すると、今回の仕様変更の影響をクリアできます。
![winactor-notepad02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/31f48ed9-874b-ae7c-7636-64cdbe6581ef.png)



### UiPath
通常一番簡単な方法で作成するシーケンスだと以下のようになるかと思います。この場合、ウィンドウの識別は内部的にウィンドウ変数 (or 専門的な言い方だとウィンドウハンドル)で行われているようなので、バージョン1903のようにタイトルの先頭にアスタリスクがついても動作に影響はないようです。
![uipath-notepad01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8f794be8-d870-f0f1-07ae-a99f25cc4998.png)

ただし、「ウィンドウにアタッチ (Attach Window)」の処理が入っている場合、ウィンドウを何で識別させているかで影響の有無が変わってきます。
![uipath-notepad02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fe5373a4-d68d-a6ab-46be-b5bafac67455.png)

UiPathではウィンドウの識別方法として「**ウィンドウ変数**」「**ウィンドウクラス名**」「**プロセス名**」「**ウィンドウタイトル**」といった4通りの方法を利用できます。

以下のように、ウィンドウ (=ウィンドウ変数)でなくセレクターで選択されている場合、ウィンドウタイトルでの識別になるため、この文字列は変更する必要があります。
![uipath-notepad03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f97f0363-c782-5c5d-a012-e5b96d3869ab.png)

変更前

```
"<wnd app='notepad.exe' cls='Notepad' title='無題 - メモ帳' />"
```

一番簡単な方法は、タイトルでのマッチを消してしまうことです。こうすると、UiPathはプロセス名などほかの方法だけでマッチングを行います。

変更後

```
"<wnd app='notepad.exe' cls='Notepad' />"
```

### Automation Anywhere
Automation Anywhere では、ウィンドウを識別する唯一の方法は「**ウィンドウタイトル**」になっているので、WinActorやUiPathよりも深刻です。

修正前
![aa-notepad01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1aecc6df-0272-fa33-2d1e-46cad5aeb873.png)

各コマンドでウィンドウタイトルを参照しているところ (`$WindowTitle$`、3行目でActive Window Title をこの変数に格納している)について、前方にワイルドカード (*) をつけて、アスタリスクがあってもなくても該当ウィンドウを捕捉できるようにすればOKです。(ちなみに、ここでは追加される文字がたまたまアスタリスクですが、今回追加するワイルドカードとたまたま文字が一致しているだけで、意味は違います。)

修正後
![aa-notepad02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/5765de47-d2a5-fb4f-c209-c679c757109a.png)

修正点
4/5行目のウィンドウタイトルの参照

* 修正前: `$WindowTitle$`
* 修正後: `*$WindowTitle$`