タイムアウトしたアプリを閉じる方法

Option Explicit

Private Declare Function OpenProcess Lib "kernel32.dll" ( _
  ByVal dwAccess As Long, _
  ByVal fInherit As Integer, _
  ByVal hObject As Long _
  ) As Long

Private Declare Function WaitForSingleObject Lib "Kernel32" ( _
  ByVal hHandle As Long, _
  ByVal dwMilliseconds As Long _
  ) As Long

Private Declare Function TerminateProcess Lib "kernel32" ( _
  ByVal hProcess As Long, _
  ByVal uExitCode As Long _
  ) As Long

Private Declare Function CloseHandle Lib "kernel32" ( _
  ByVal hObject As Long _
  ) As Long
  
Const SYNCHRONIZE = 1048576
Const WAIT_TIMEOUT = 258
Const PROCESS_TERMINATE = &H1

Private Sub Main()

    Dim ProcessID     As Long
    Dim ProcessHandle As Long
    Dim Ret           As Long

    ProcessID = Shell("notepad.exe", vbNormalNoFocus)

    ProcessHandle = OpenProcess(SYNCHRONIZE, True, ProcessID)
    
    Ret = WaitForSingleObject(ProcessHandle, 5000)
    
    Call CloseHandle(ProcessHandle)
    ProcessHandle = OpenProcess(PROCESS_TERMINATE, True, ProcessID)
    
    Call TerminateProcess(ProcessHandle, 0&)
    Call CloseHandle(ProcessHandle)
    
    If Ret = WAIT_TIMEOUT Then Debug.Print "タイムアウト!"

End Sub

OpenProcess の第1引数を変えて、ハンドルを開きなおす必要があるところでちょっと躓いたのでメモしておく。