【こんなライブラリが欲しい】ウィンドウの存在有無を取得したい
お世話になっております。
いろんなシナリオを作成していますが、どのシナリオでも「特定のウィンドウが今開いているかどうか」を確認したい場面がとても多いです。(指定のウィンドウが表示されるまで待機、指定のウィンドウがなければ新しくウィンドウを立ち上げる etc)
過去質問(ウィンドウが開いてるかどうかを確認したい)もありますが、
ここで回答されている通り、例外処理ノードを用いての判定(ウィンドウがあれば正常、なければエラー)で処理されているのがおそらく大多数ではないでしょうか。
しかし、そもそもエラーを判定せずとも、ファイル存在有無のライブラリがあるように、ウィンドウの存在有無のライブラリがあってもいいのでは?と思い、ライブラリの中を見てみました。
参考にしたのは「11_ウィンドウ関連>ウィンドウ前面化.ums6」です。
※WinActor v6.3.0で作成したシナリオでは「ウィンドウ前面化」にはWinActor独自関数「ShowUMSHighlight」が使用されていますが、WinActor v6.1.0で作成したシナリオでは「CreateObject("WScript.Shell").AppActivate」が使用されていました。
違いについては後述します。
-----------------------------------------------------------
まず、プロパティの「ウィンドウ識別名」で指定したウィンドウのタイトルを取得するのに、WinActor独自関数「GetUMSWindowTitle」が使用されています。
ここで、プロパティの識別名で指定したウィンドウが存在する場合はウィンドウタイトルを取得しますが、存在しない場合は「Null」値を返す仕様のようです。
つまり、WinActor独自関数「GetUMSWindowTitle」の値を「windowTitle」に格納した後、
「windowExist = Not IsNull(windowTitle)」とすることで、ウィンドウの存在有無を「True/False」で取得することができます。
あとは「SetUMSVariable $ウィンドウ存在有無$, windowExist」とすれば、ライブラリのプロパティでウィンドウ存在有無を変数に格納することができるので、例外処理ではなく、通常の分岐ノードで判定できるようになります。
※注意点※
WinActor独自関数「ShowUMSHighlight」では、引数がNull値でもエラーにならないようですが、「CreateObject("WScript.Shell").AppActivate」は引数にNullが指定されているとエラーになります。
(ウィンドウ前面化でウィンドウが存在しないときにエラーになるのはこのせい)
なので、「CreateObject("WScript.Shell").AppActivate」が使われているライブラリでは、
If windowExist = true Then
Set objWshShell = CreateObject("WScript.Shell")
objWshShell.AppActivate windowTitle
End If
とすることで、エラーが回避できます。
ライブラリの記述が短く、全文を記載するわけにはいかないので記事としては分かりにくい書き方になってしまいました。(そもそもこの内容、独自でスクリプトを修正して実装している方も多そうですが…)
ぜひ、公式でライブラリを実装していただけるととっても有難いです。