HOME > 即効テクニック > AccessVBA > Access設定 > 起動したアプリケーションの終了を取得する

即効テクニック

Access設定

起動したアプリケーションの終了を取得する

(Access 2000/2002/2003)
● 概要 ●
宣言文 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)