Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const PROCESS_VM_READ As Long = (&H10)
Private Const WM_CLOSE As Long = &H10
#If VBA7 Then
Private Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As LongPtr, lphModule As LongPtr, ByVal cb As Long, lpcbNeeded As Long) As LongPtr
Private Declare PtrSafe Function GetModuleBaseName Lib "psapi.dll" Alias "GetModuleBaseNameA" (ByVal hProcess As LongPtr, ByVal hModule As LongPtr, ByVal lpFilename As String, ByVal nSize As Long) As LongPtr
Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As LongPtr, lpdwProcessId As Long) As Long
Private Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPtr
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long
Private Declare PtrSafe Function EnumWindows Lib "user32" (ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function IsWindowVisible Lib "user32" (ByVal hWnd As LongPtr) As Long
#Else
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef lpcbNeeded As Long) As Long
Private Declare Function GetModuleBaseName Lib "psapi.dll" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindowVisible Lib "user32.dll" (ByVal hWnd As Long) As Long
#End If
Private appName As String
#If VBA7 Then
Function EnumWindowsProc(ByVal hWnd As LongPtr, ByVal lParam As LongPtr) As Long
Dim lModules() As LongPtr, hProcess As LongPtr
#Else
Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
Dim lModules() As Long, hProcess As Long
#End If
Const MAX_PATH As Long = 260
Dim ProcId As Long, cbNeeded As Long, sName As String
EnumWindowsProc = 1
If IsWindowVisible(hWnd) Then
GetWindowThreadProcessId hWnd, ProcId
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, ProcId)
If hProcess Then
ReDim lModules(1 To 1024)
If EnumProcessModules(hProcess, lModules(1), 1024 * LenB(lModules(1)), cbNeeded) Then
sName = String(MAX_PATH, vbNullChar)
GetModuleBaseName hProcess, lModules(1), sName, MAX_PATH
sName = LCase(Left(sName, InStr(sName, vbNullChar) - 1))
If sName = appName Then PostMessage hWnd, WM_CLOSE, 0, 0
End If
CloseHandle hProcess
End If
End If
End Function
Private Sub CloseApp(ByVal ProcName As String)
appName = ProcName
EnumWindows AddressOf EnumWindowsProc, 0
End Sub
Sub test()
CloseApp "firefox.exe"
' CloseApp "chrome.exe"
' CloseApp "winword.exe"
' CloseApp "notepad.exe"
End Sub