連携 Shell関数で実行したアプリ(タスク)の終了を認識する関数

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

ここでは2つの方法を紹介しています。
Option Explicit

'①Win32 API関数を使い終了を認識する
Public Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As LongAs Long
Public Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As LongByVal bInheritHandle As Long, _
    ByVal dwProcessID As LongAs Long
Public Const PROCESS_QUERY_INFORMATION = &H400


Function TaskQuitForAPI(strTaskPath As StringAs Boolean
'******************************************************
'Shell関数で実行したアプリ(タスク)の終了を認識する関数
'******************************************************
'上記Win32 API 関数を使用
'本関数内でShellを実行している為、返値は何でも良いがBooleanを使用

Dim dwProcessID As Long
Dim hProcess As Long
Dim lpdwExitCode As Long
Dim ret As Long

'実行及びタスクIDを取得
dwProcessID = Shell(strTaskPath, 1)
'ハンドル取得
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)

Do
  'プロセスの終了ステータスを取得
  ret = GetExitCodeProcess(hProcess, lpdwExitCode)
  '終了するまで待機
  DoEvents
Loop While lpdwExitCode
'++++++++++++++++++++++++++++++
'ここまで来るとLoopを抜けたので
'++++++++++++++++++++++++++++++
    TaskQuitForAPI = True '返値を返す
End Function


Private Sub test()
Dim strPath As String
'メモ帳のパス
strPath = """C:\WINDOWS\NOTEPAD.EXE"""

If TaskQuitForAPI(strPath) = True Then
    MsgBox "タスク" & vbCr & strPath & vbCr & "終了しました。"
End If

End Sub


Option Explicit


'②WScript.Shell(Windows Scripting Host)Runメソッドを使い終了を認識する

Function TaskQuitForWSH(strTaskPath As StringAs Boolean
'******************************************************
'Shell関数で実行したアプリ(タスク)の終了を認識する関数
'******************************************************
'WScript.Shell(Windows Scripting Host)Runメソッドを使用
'本関数内でShellを実行している為、返値は何でも良いがBooleanを使用

'Runメソッドの引数
'WaitOnReturn=True-プロセス完了まで待機
CreateObject("WScript.Shell").Run strTaskPath, , True

TaskQuitForWSH = True

End Function


Private Sub test2()
Dim strPath As String
'メモ帳のパス
strPath = """C:\WINDOWS\NOTEPAD.EXE"""

If TaskQuitForWSH(strPath) = True Then
    MsgBox "タスク" & vbCr & strPath & vbCr & "終了しました。"
End If

End Sub

 

 

 

2000年01月01日|[VBサンプルコード]:[連携]