(BluePrism)汎用的にキー送信するオブジェクトを作る ~1 of 2 骨子編~
ちわっす。おむおむです。
最近進めているポケモン図鑑シリーズから外れて、
ちょっと書きたいことがあったので。
以前、コミュニティでこんな投稿がありました。
※Blue PrismのJapan User Communityへの登録が必要です
community.blueprism.com
汎用的にキー送信するオブジェクトある?
とのこと。
一通り探しましたが、確かになさそう。。。
だけど、あったら確実に便利・・・!
ということで、作ってみます☆
- 機能の要件を確認する
- アプリケーションモデラーを設定する
- テキトーなウィンドウ要素をスパイする
- アタッチのアクションを設定する。
- アタッチの入力パラメータ設定
- キー送信アクション
- 要素の動的パラメータ
- まとめ
機能の要件を確認する
まずは機能要件をまとめてみましょう。
グローバルキー/キーイベント送信のセオリーとして、
「アプリケーションをアクティブ化」アクションを使用して
キー送信対象のアプリケーションを
アクティブな状態にする必要があります。
そして送信するキーの中に
特殊キー(Ctrl、Alt、Shiftなど)が含まれている場合、
キー送信の時間間隔を入れると内部エラーが発生します。
そのため、入力パラメータの「間隔」には
何も指定しないようにします。
そして、アプリケーションにアタッチする際に
諸々情報が必要になりますが、
プロセス名またはウィンドウタイトルを
入力パラメータに指定するような設計にしようと思います。
※アタッチに関しては以下を参照↓
newgraduate19-rpa.hatenablog.com
アプリケーションモデラーを設定する
では実装に入っていきましょう。
アプリケーションモデラーでは、以下のように設定します。
1. 新しいアプリケーションモデルを定義 アプリケーション名:任意のアプリケーション 2. Windowsアプリケーション 3. アプリケーションは既に実行されており、その既存のインスタンスにアタッチ 4. 対象アプリケーションのウィンドウタイトルを入力 (入力なし) 5. 対象のアプリケーションのWindowsプロセス名を入力 (入力なし) 6. アタッチできない場合、アプリケーションは必要に応じて・・・ (入力なし) 7. それ以降はすべてデフォルトのまま
完了した段階でこんな感じになります。
空っぽです。
テキトーなウィンドウ要素をスパイする
次に、ウィンドウ要素をスパイします。
「アプリケーションをアクティブ化」アクションは
Win32モードでスパイした
ウィンドウ要素にしか使えないからです。
まずはテキトーなアプリケーションを起動し、アタッチします。
自分の場合はメモ帳(notepad.exe)にしました。
そしてウィンドウ全体をスパイします。
「マッチ」のカラム部分をクリックして
チェックがついているところだけをソートすると、
こんな感じになっています。
「クラス名」については、
アプリケーションごとに異なるのでチェックを外します。
となると、ウィンドウ要素を一意に識別するためには、
「ウィンドウテキスト」属性を
上手いこと使ってあげる必要がありそうですね。
ここをアプリケーションによって動的にするために、
「一致タイプ」を
「動的」にします。
そして一応「マッチインデックス」にもチェックをつけておきましょう。
最終的にはこんな感じ。
アプリケーションモデラーの設定については、以上で完了とします。
アタッチのアクションを設定する。
続いて、アクションの実装に移ります。
詳細は過去記事参照ですが、
読み取りステージで「接続されているかどうか」、
判断ステージで「[読み取りステージで出力されたフラグ]」、
操作ステージでアプリケーションのルート要素
(今回の場合は「任意のアプリケーション」)で
「アタッチ」アクションを選択します。
※入力パラメータについては後述
そしてアタッチが不安定な場合に備えて、
ベストプラクティスからは外れてしまいますが
アタッチのエラーをキャッチし、
一定時間waitしてから何度かリトライできるよう
ロジックを追加しておきます。
こんな感じですね。
ちなみにベストプラクティスに準拠して、
待機時間用の数値型のグローバルデータアイテムを
予め初期化ステージに配置しています。
アタッチの入力パラメータ設定
さて、肝心の入力パラメータの設定です。
テキスト型のグローバルデータアイテムとして、
以下の2つを配置します。
・ウィンドウタイトル
・プロセス名
そしてアタッチアクションに戻り、
操作ステージのプロパティから
入力パラメータを指定していきます。
・ウィンドウタイトル:[ウィンドウタイトル]
・プロセス名:[プロセス名]
・子インデックス番号:0(画像の場合データアイテム)
こんな感じにします。
キー送信アクション
そして本処理である
グローバルキー送信のアクションを作成していきます。
まずは開始ステージのプロパティを開き、
入力パラメータとして
ウィンドウタイトルとプロセス名と送信キーを追加します。
次に、操作ステージのプロパティを開き、
アクションを2つ設定します。
【1つ目】
要素:ウィンドウ要素
アクション:アプリケーションをアクティブ化
【2つ目】
要素:アプリケーションのルート要素
アクション:グローバルキー送信
入力パラメータ:「テキスト」に「[送信キー]」、「間隔」はなし
【各ステップの後に一時停止】
0.5秒から1秒ぐらい(今回はグローバルデータアイテムを使用)
これで設定完了です!
要素の動的パラメータ
ウソです!
一点、今回のキモといえる部分を忘れていました!
それは、ウィンドウ要素の
ウィンドウタイトル属性の指定です!
操作ステージのプロパティで、
ウィンドウ要素を指定したところの
パラメーター列の三点のやつが
アクティブになっていることが確認できるかと思います。
こいつをクリックすると・・・
先ほどアプリケーションモデラーで動的に設定した、
「ウィンドウタイトル」属性の値を
設定する画面が開きます。
ここで、このアクション自体の入力パラメータとして与えた
[ウィンドウタイトル]のデータアイテムを指定します。
ただし!
一致タイプを「=(等しい)」のままにしておくと、
ウィンドウタイトルが完全一致しないと
ウィンドウ要素を見つけられずエラーを吐いてしまいます。
そのため、一致タイプを*(ワイルドカード)にすることで
部分一致でも見つけられるようにしてあげます。
うーん、ユーザーフレンドリー☆
同様に、グローバルキーイベント送信も
同じように作ります。(テキトー)
大筋としてはこんな感じです。
これだけじゃちょっと味気ないので、
次回コードステージなんかを使って
ユーザーフレンドリー感を増してみます☆
まとめ
・要素タイプを動的にすると汎用性が増す
・その分設定のし忘れや変更がハネる箇所が増えるので注意
・完成したらGitHubとかに上げたい(ジャストアイデア)
・ジャストアイデアなんで
「ぜひDXにアップしましょう!」
「御社の名前を世界に知らしめるチャンスですよ!」みたいな
圧かけるのやめてください死んでしまいます