UiPathにおけるイベント監視系アクティビティの変遷を整理してみる。

#はじめに
　2020年8月24日にUiPath Platform 20.8 previewがリリースされました。今回のアップデート内容の一つとしてイベント監視系アクティビティの一新があります。アクティビティの表示名は同じですが、中身は別物となっており、従来アクティビティとの互換性はありません。整理を兼ねてこれらの変遷をまとめてみます。

#イベント監視系アクティビティとは？
　ここでは、イベント監視系アクティビティを、「なんらかの変化を検知し、それをきっかけに特定の動作を行う仕組みを提供するアクティビティ」として説明します。何らかの変化とは例えばキーボード入力やマウス入力、ファイルの変更や削除等が該当します。具体的には**ファイル変更トリガー**アクティビティや**マウストリガー**アクティビティ等があります。なお画面要素が対象となる、On～Appear/Disappear系アクティビティはここでは含めていません。

#イベント監視系アクティビティ変遷の概要
　UiPathにおけるイベント監視系アクティビティは、今回のアップデートを含めて、以下の通り大きく３世代に分類できると考えています。（世代というのは勝手に筆者がつけたもので公式ではありません）順を追ってみていきましょう。


##イベントを監視(MonitorEvent)アクティビティ内で動作するトリガーアクティビティ(2020.4未満)(第一世代)

　UiAutomation.Activities Package内にある__イベントを監視__アクティビティを用い、その中に各種トリガーアクティビティを配置するタイプです。各イベントの情報は、イベントハンドラーの中で__イベント情報を取得__アクティビティを通じて取得することが可能です。

例：イベントを監視＋ファイル変更トリガー(FileChangeTrigger)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/3ad1b6b8-80ef-5e8e-ccf6-b973a41c1d6f.png)




##単独でイベント監視可能なアクティビティ(2019.10や2020.4での一部アクティビティ)(第二世代)
　2019.10ではバックグラウンドプロセスが導入されましたが、__イベントを監視__アクティビティがUiAutomation.Activities Package内にあるため、このままでは（UIには直接関係のない）ファイル変更の検知がバックグラウンドプロセスで動作させることができない課題が出てきたのではないかと思います。あくまで推測ですが、これの対応として、__イベントを監視__アクティビティが無くとも単独で動作可能な__ファイル監視トリガー(FileChangeTriggerV2)__アクティビティが用意されたのではないかと思います。下図のように、単独でファイルの変更監視機能を提供します。また同様の形態として、同じく2019.10でリリースされた__プロセス開始トリガー__、__プロセス終了トリガー__もあります。（そのためこれらもバックグラウンドプロセスでも動作可能です。）


例：ファイル変更トリガー(FileChangeTriggerV2)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/f845ff0e-7392-5743-8ae9-caddf11e0ece.png)



##トリガースコープ(TriggerScope)アクティビティ内で動作するトリガーアクティビティ(2020.8以降)(第三世代)
最新の2020.8では、これらが統合された、__TriggerScope__の仕組みが提供されました。__TriggerScope__自身はSystem.Activities Packageに同梱されていますので、バックグラウンドプロセスでも動作可能です。またイベントの情報はargs変数を通じて、内部で参照できるようになっています。

例：TriggerScope＋ファイル変更トリガー(FileChangeTriggerV3)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/205ae69f-70f8-8a92-8ece-3e0b66ae2681.png)


#各トリガーアクティビティの整理
 このようにActivity Packageのバージョンによって、同梱されているイベント監視系アクティビティのタイプが異なります。表示名はすべて同じなので、アクティビティ名でこれを識別する必要があります。プロパティパネルの最上部を参照するのが良いと思います。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477147/7265e814-1cfd-0d3a-5d52-761af46d6fe4.png)

以下の表はイベント監視系アクティビティが上記のどの世代に該当するかをまとめたものです。

|Activity Name|Gen1|Gen2|Gen3|Package|
|--------|----|----|----|----|
|FileChangeTrigger|無印|V2|V3|System|
|ProcessStartTrigger|-|無印|V2|System|
|ProcessEndTrigger|-|無印|V2|System|
|SystemTrigger|無印|-|V2|UiAutomation|
|HotkeyTrigger|無印|-|V2|UiAutomation|
|MouseTrigger|無印|-|V2|UiAutomation|
|ClickImageTrigger|無印|-|V2|UiAutomation|
|KeyPressTrigger|無印|-|V2|UiAutomation|
|ClickTrigger|無印|-|V2|UiAutomation|
Gen1:MonitorEvent内で動作、Gen2:単独動作、Gen3:TriggerScope内で動作

　特に単独動作可能なものを、イベント監視やTriggerScope内で使うと、エラーにならず、想定した挙動と異なる動作となることがありますので、注意が必要です。

#下位互換
　現在の最新バージョンである2020.8previewに同梱されているアクティビティパッケージでは、上記の古いイベント監視系アクティビティは新たに選択はできません。ただし互換性維持のため、古いアクティビティもパッケージ内に同梱されているようで、古いワークフローがエラーとはなることはありません。

#カスタムトリガーアクティビティ
TriggerScopeアクティビティリリースに伴い、これに対応可能なカスタムトリガーアクティビティを作成できるSDKが用意されています。
詳しくは以下参照ください。

https://docs.uipath.com/developer/docs/how-to-create-a-custom-trigger

#まとめ
　今回TriggerScopeアクティビティがリリースされ、ほぼ強制的に従来アクティビティと置き換わりましたので、今後は否応なしに、こちらの仕組みに移行していくものと考えられます。
　機能の面では色々と強化されており喜ばしい反面、これらのアクティビティはUiAutomationやSystemのアクティビティパッケージのバージョンに依存しているため、特に古いバージョンのパッケージを使用している場合、名前が同じなのに仕様が異なるとのことで、混乱の元になるかもしれません。
　もしイベント監視系のアクティビティの動作が想定と異なると思ったら、アクティビティ名（表示名ではなく）をチェックして、想定しているアクティビティかどうかをまずは確認した方が良いかもしれません。