hi ,
how to determine , is an application running or not ?
and if it is running , how to kill it ?
thanks.
Printable View
hi ,
how to determine , is an application running or not ?
and if it is running , how to kill it ?
thanks.
Try this
VB Code:
Option Explicit Public Const PROCESS_QUERY_INFORMATION = 1024 Public Const PROCESS_VM_READ = 16 Public Const MAX_PATH = 260 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const SYNCHRONIZE = &H100000 'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF Public Const PROCESS_ALL_ACCESS = &H1F0FFF Public Const TH32CS_SNAPPROCESS = &H2& Public Const hNull = 0 Public Enum ePlatform eWin95_98 = 1 eWinNT = 2 End Enum 'Usage 'Then call the routine like this: 'If IsApplicationRunning("MyProgram.exe") Then ' MsgBox "Application is running." 'Else ' MsgBox "Application is not running." 'End If Public Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long ' This process th32DefaultHeapID As Long th32ModuleID As Long ' Associated exe cntThreads As Long th32ParentProcessID As Long ' This process's parent process pcPriClassBase As Long ' Base priority of process threads dwFlags As Long szexeFile As String * 260 End Type Private Declare Function ProcessFirst _ Lib "kernel32" Alias "Process32First" (ByVal hSnapshot _ As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" _ Alias "Process32Next" (ByVal hSnapshot As Long, _ uProcess As PROCESSENTRY32) As Long Private Declare Function CreateToolhelpSnapshot _ Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal _ lFlags As Long, lProcessID As Long) As Long Private Declare Function TerminateProcess _ Lib "kernel32" (ByVal hProcess As Long, ByVal _ uExitCode As Long) As Long Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long Public Declare Function Process32First Lib "kernel32" ( _ ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Public Declare Function Process32Next Lib "kernel32" ( _ ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Public Declare Function CloseHandle Lib "Kernel32.dll" _ (ByVal Handle As Long) As Long Public Declare Function OpenProcess Lib "Kernel32.dll" _ (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _ ByVal dwProcId As Long) As Long Public Declare Function EnumProcesses Lib "psapi.dll" _ (ByRef lpidProcess As Long, ByVal cb As Long, _ ByRef cbNeeded As Long) As Long Public Declare Function GetModuleFileNameExA Lib "psapi.dll" _ (ByVal hProcess As Long, ByVal hModule As Long, _ ByVal strModuleName As String, ByVal nSize As Long) As Long Public Declare Function EnumProcessModules Lib "psapi.dll" _ (ByVal hProcess As Long, ByRef lphModule As Long, _ ByVal cb As Long, ByRef cbNeeded As Long) As Long Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _ ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Public gDBType As String Public Function IsApplicationRunning(pEXEName As String) As Boolean On Error Resume Next Select Case getVersion() Case eWin95_98 Dim lProc As Long Dim strName As String Dim hSnap As Long Dim proc As PROCESSENTRY32 hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) If hSnap = hNull Then Exit Function proc.dwSize = Len(proc) ' Iterate through the processes lProc = Process32First(hSnap, proc) Do While lProc strName = StrZToStr(proc.szexeFile) If InStr(UCase(strName), UCase(pEXEName)) Then IsApplicationRunning = True Exit Function End If lProc = Process32Next(hSnap, proc) Loop Case eWinNT Dim cb As Long Dim cbNeeded As Long Dim NumElements As Long Dim lProcessIDs() As Long Dim cbNeeded2 As Long Dim lNumElements2 As Long Dim lModules(1 To 200) As Long Dim lRet As Long Dim strModuleName As String Dim nSize As Long Dim hProcess As Long Dim i As Long 'Get the array containing the process id's for each process object cb = 8 cbNeeded = 96 Do While cb <= cbNeeded cb = cb * 2 ReDim lProcessIDs(cb / 4) As Long lRet = EnumProcesses(lProcessIDs(1), cb, cbNeeded) Loop NumElements = cbNeeded / 4 For i = 1 To NumElements 'Get a handle to the Process hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _ Or PROCESS_VM_READ, 0, lProcessIDs(i)) 'Got a Process handle If hProcess <> 0 Then 'Get an array of the module handles for the specified process lRet = EnumProcessModules(hProcess, lModules(1), 200, cbNeeded2) 'If the Module Array is retrieved, Get the ModuleFileName If lRet <> 0 Then strModuleName = Space(MAX_PATH) nSize = 500 lRet = GetModuleFileNameExA(hProcess, lModules(1), strModuleName, nSize) strModuleName = Left(strModuleName, lRet) 'Check for the client application running If InStr(UCase(strModuleName), UCase(pEXEName)) Then IsApplicationRunning = True Exit Function End If 'List1.AddItem Left(strModuleName, lRet) End If End If 'Close the handle to the process lRet = CloseHandle(hProcess) Next End Select End Function Private Function StrZToStr(pString As String) As String StrZToStr = Left$(pString, Len(pString) - 1) End Function Private Function KillApp(myName As String) As Boolean Const PROCESS_ALL_ACCESS = 0 Dim uProcess As PROCESSENTRY32 Dim rProcessFound As Long Dim hSnapshot As Long Dim szExename As String Dim exitCode As Long Dim myProcess As Long Dim AppKill As Boolean Dim appCount As Integer Dim i As Integer On Local Error GoTo Finish appCount = 0 Const TH32CS_SNAPPROCESS As Long = 2& uProcess.dwSize = Len(uProcess) hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) rProcessFound = ProcessFirst(hSnapshot, uProcess) Do While rProcessFound i = InStr(1, uProcess.szexeFile, Chr(0)) szExename = LCase(Left(uProcess.szexeFile, i - 1)) If Right(szExename, Len(myName)) = LCase$(myName) Then KillApp = True appCount = appCount + 1 myProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) AppKill = TerminateProcess(myProcess, exitCode) Call CloseHandle(myProcess) End If rProcessFound = ProcessNext(hSnapshot, uProcess) Loop Call CloseHandle(hSnapshot) Finish: End Function
thanks oh1mie , that's exactly i want.