即効テクニック |
● 概要 ● 宣言文 Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long 設定項目 内容 hProcess プロセスオブジェクトのハンドルを指定[省略不可] lpExitCode 終了コードを取得する長整数型変数を指定 引数で指定したプロセスオブジェクトの終了コードを引数 として返します。 戻り値は「0」以外の値で、失敗時には「0」を返します。 引数 には長整数型変数を指定します。この値が定数「STILL_ACTIVE(=&H103)」の間はプロセスが終了していないので、ループ処理によってこの値を監視し続けることで、アプリケーションの終了を取得することができます。 次のコードは、起動した電卓が終了するとメッセージダイアログを表示するサンプルです。 ● サンプル1 ● Private Declare Function OpenProcess _ Lib "kernel32" _ (ByVal dwDesiredAccess As Long _ , ByVal bInheritHandle As Long _ , ByVal dwProcessId As Long) As Long Private Declare Function CloseHandle _ Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess _ Lib "kernel32" _ (ByVal hProcess As Long _ , lpExitCode As Long) As Long Private Const STATUS_PENDING As Long = &H103 Private Const STILL_ACTIVE As Long = STATUS_PENDING Private Const PROCESS_QUERY_INFORMATION As Long = &H400 '起動したアプリケーションの終了を取得する Sub Sample1() Dim myId As Long Dim myProcess As Long Dim myExitCode As Long '電卓の起動 myId = CLng(Shell("calc", vbNormalFocus)) 'プロセスオブジェクトハンドルの取得 myProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, myId) '終了コードの監視 Do GetExitCodeProcess myProcess, myExitCode DoEvents Loop While myExitCode = STILL_ACTIVE 'オブジェクトハンドルの解放 CloseHandle myProcess 'メッセージを表示 MsgBox "起動した電卓が閉じられました。", vbInformation End Sub また、同様にウィンドウハンドルが取得できるか否かを監視し続けることによって、アプリケーションの終了を取得することもできます。 次のコードは、「Sample1」プロシージャとまったく同じ処理を行うサンプルで す。 ● サンプル2 ● Private Declare Function GetForegroundWindow _ Lib "user32" () As Long Private Declare Function GetTopWindow _ Lib "user32" _ (ByVal hwnd As Long) As Long Private Const ERROR_SUCCESS As Long = 0 '起動したアプリケーションの終了を取得する Sub Sample2() Dim myHwnd As Long, myTmp As Long '電卓を起動してアクティブにする AppActivate Shell("calc", vbNormalFocus) 'ウィンドウハンドルの取得 myHwnd = GetForegroundWindow() 'ウィンドウハンドルを利用した関数によって監視 Do myTmp = GetTopWindow(myHwnd) DoEvents Loop Until myTmp = ERROR_SUCCESS 'メッセージの表示 MsgBox "起動した電卓が閉じられました。", vbInformation End Sub ● 補足1 ● サンプル1で戻り値を必要としない場合には、Subプロシージャとして宣言してもかまいません。 Declare Sub GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) ● 補足2 ● 「Sample2」プロシージャ内で使用しているGetTopWindow関数は、引数 で指定したウィンドウのトップレベルの子ウィンドウのウィンドウハンドルを返す関数です。失敗時には「0」を返します。ここでは、GetTopWindow関数を使う必要があるわけではなく、ウィンドウハンドルを元に何らかの情報を返す関数であれば、何を使ってもかまいません。 Declare Sub CloseHandle Lib "kernel32" (ByVal hObject As Long)