Run 関数で起動したアプリケーションが終了するまで処理を止める
2022/03/08
方法
Run 関数で起動したアプリケーションは非同期で実行されるため、アプリケーションの終了を待たず即座に次の処理が行われます。同期処理のように Run 関数で起動したアプリケーションが終了するまで処理を停止するには、レスポンスウィンドウを利用します。
レスポンスウィンドウが表示されている間はアプリケーションの他のウィンドウへのアクセスができません。この動作を利用し、Run 関数で外部アプリケーションを起動してからレスポンスウィンドウを表示して次の処理へ移行しないようにします。
起動されたアプリケーションをレスポンスウィンドウで監視し、アプリケーションが終了されたらレスポンスウィンドウを閉じることで、次の処理へ移行できるようになります。
下記の例では、Run 関数で起動したメモ帳が終了するまで処理を停止します。メモ帳の起動直後にレスポンスウィンドウを開いて Timer イベントでメモ帳の存在を監視し、メモ帳が見つからなくなったらレスポンスウィンドウを閉じて処理を続行します。
起動されたアプリケーションのハンドルを取得するために Windows API の FindWindow を使用し、起動したアプリケーションの有無を監視するために IsWindow 関数を外部関数として利用しています。
【例】
メモ帳を起動する処理
// メモ帳を起動する Run("notepad.exe") // レスポンスウィンドウを開く Open(w_res) // メッセージを表示する MessageBox("Info", "メモ帳を終了しました!")
レスポンスウィンドウ (w_res)
[外部関数の宣言]
PUBLIC FUNCTION unsignedlong FindWindow (long classname, string windowname) LIBRARY "user32.dll" ALIAS FOR "FindWindowW" PUBLIC FUNCTION boolean IsWindow (Long hwnd) LIBRARY "user32.dll"
[インスタンス変数の宣言]
unsignedlong iu_handle // ウィンドウハンドル
[Open イベント]
// アプリケーションの起動を待つ Sleep(1) // 指定したタイトルを持つアプリケーションのハンドルを取得 iu_handle = FindWindow(0,"無題 - メモ帳") // タイマーイベントを 1 秒の間隔で起動 Timer(1)
[Timer イベント]
// ハンドルが無効の場合 IF NOT IsWindow(iu_handle) THEN // タイマーイベントを止める Timer(0) // レスポンスウィンドウを閉じる Close(this) END IF
Tips情報
プロダクト :PowerBuilder
バージョン :2019R3