Option Explicit


Private Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId 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

Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long



Private Const PROCESS_ALL_ACCESS = &H1F0FFF


Private Target As String


'---------------------------------------------------------------------------------------

' Creation Date :   24/10/2005 09:03

' Created By    :   Jason Bruwer

' Purpose         :   Returns the windows handle of a window if you know the name

'                    :   E.g.

'                           Microsoft Word

'                           Microsoft Excel

'                           Microsoft PowerPoint

'                           Adobe Reader

' Updated By    :   [Initials] - [Date] - [Changes]

'---------------------------------------------------------------------------------------

Public Function GetWindowsHandle(WindowName As String, hWindow As Long) As Boolean


    On Error GoTo Errors


    ' Get the target's window handle.

    hWindow = FindWindow(vbNullString, WindowName)


    If hWindow = 0 Then GoTo Cheers


    GetWindowsHandle = True


Cheers:

    Exit Function

Errors:

    frmMain.LogErrorAcrossUsingRBT ("GetWindowsHandle")

    GoTo Cheers

End Function



'---------------------------------------------------------------------------------------

' Creation Date :   24/10/2005 09:03

' Created By    :   Jason Bruwer

' Purpose        :   Enumerates all the currently open windows and searches for an application

'                        with the specified name.

' Updated By    :   [Initials] - [Date] - [Changes]

'---------------------------------------------------------------------------------------

Public Function TerminateTask(app_name As String) As Boolean



Target = UCase(app_name)

EnumWindows AddressOf EnumCallback, 0


TerminateTask = True


End Function



'---------------------------------------------------------------------------------------

' Creation Date :   24/10/2005 09:04

' Created By    :   Jason Bruwer

' Purpose         :  Checks to see if this is the window we are looking for and then trys

'                        to kill the application

' Updated By    :   [Initials] - [Date] - [Changes]

'---------------------------------------------------------------------------------------

Public Function EnumCallback(ByVal app_hWnd As Long, ByVal param As Long) As Long

Dim buf As String * 256

Dim title As String

Dim length As Long


' Get the window's title.

length = GetWindowText(app_hWnd, buf, Len(buf))

title = Left$(buf, length)


'If title <> "" Then Debug.Print title


' See if this is the target window.

If InStr(UCase(title), Target) <> 0 Then

    ' Kill the window.

    If Not KillProcess(app_hWnd) Then Exit Function

End If


' Continue searching.

EnumCallback = 1


End Function



'---------------------------------------------------------------------------------------

' Creation Date :   24/10/2005 09:06

' Created By    :   Jason Bruwer

' Purpose         :  Trys to kill an application by using its windows handle

' Updated By    :   [Initials] - [Date] - [Changes]

'---------------------------------------------------------------------------------------

Public Function KillProcess(hWindow As Long) As Boolean

Dim RetrunValue As Long

Dim ProcessValue As Long

Dim ProcessValueID As Long

Dim ThreadID As Long


    If (IsWindow(hWindow) <> 0) Then

      ThreadID = GetWindowThreadProcessId(hWindow, ProcessValueID)


      If (ProcessValueID <> 0) Then

        App.LogEvent "Warning...killing orphan process..."


        ProcessValue = OpenProcess(PROCESS_ALL_ACCESS, CLng(0), ProcessValueID)

        RetrunValue = TerminateProcess(ProcessValue, CLng(0))

        CloseHandle ProcessValueID

      End If


    End If


    KillProcess = True

End Function


출처: 스택 오버플로우