用TerminateProcess,需要processid,因为SHELLEXECUTE无法返回pid,所以建议你用shell调用那个exe,这样可以省去很多麻烦。
以下例:Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As LongConst PROCESS_QUERY_INFORMATION = &H400Private Sub Form_Load()
Dim pid As Long
Dim hProcess As Long
pid = Shell("notepad.exe", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
TerminateProcess hProcess, 0
CloseHandle hProcess
End Sub为了简单,没有考虑在NT下运行的情况,因为NT下用TerminateProcess还需要exit code,也是很麻烦。
以下例:Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As LongConst PROCESS_QUERY_INFORMATION = &H400Private Sub Form_Load()
Dim pid As Long
Dim hProcess As Long
pid = Shell("notepad.exe", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
TerminateProcess hProcess, 0
CloseHandle hProcess
End Sub为了简单,没有考虑在NT下运行的情况,因为NT下用TerminateProcess还需要exit code,也是很麻烦。
出错的话就结束这个进程吗?
(ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" _
(ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPrivate Declare Function Process32Next Lib "kernel32" _
(ByVal hSapshot As Long, lppe As PROCESSENTRY32) As LongPrivate Declare Function TerminateProcess Lib "kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As LongPrivate Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As LongPrivate Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As LongPrivate Type PROCESSENTRY32
dwSize As Long
cntUseage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
swFlags As Long
szExeFile As String * 1024
End TypePrivate Const TH32CS_SNAPPROCESS = &H2
Private Const PROCESS_TERMINATE = &H1
Private Sub Form_Load()
ListView1.View = lvwReport
ListView1.ColumnHeaders.Add , , "文件名", 5000
ListView1.ColumnHeaders.Add , , "进程ID", 1500
Call ShowProcessInfo
End Sub
Private Sub cmdRefresh_Click()
Call ShowProcessInfo
End Sub
Private Sub cmdTerminate_Click()
Dim lngProcess As Long
If ListView1.SelectedItem Is Nothing Then
Exit Sub
End If
lngProcess = OpenProcess(PROCESS_TERMINATE, _
0&, _
Val(ListView1.SelectedItem.SubItems(1)))
Call TerminateProcess(lngProcess, 1&)
Call CloseHandle(lngProcess)
Call ShowProcessInfo
End Sub
Private Sub cmdQuit_Click()
Unload Me
End Sub
Private Sub ShowProcessInfo()
Dim pe As PROCESSENTRY32
Dim r As Long, i As Long
Dim ListItemX As ListItem
ListView1.ListItems.Clear
r = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If r <> 0 Then
pe.dwSize = 1060
Process32First r, pe
Set ListItemX = ListView1.ListItems.Add(, , GetFileName(pe.szExeFile))
ListItemX.SubItems(1) = pe.th32ProcessID
Do
i = Process32Next(r, pe)
If i > 0 Then
Set ListItemX = ListView1.ListItems.Add(, , GetFileName(pe.szExeFile))
ListItemX.SubItems(1) = pe.th32ProcessID
Else
Exit Do
End If
Loop
End If
End Sub
Private Function GetFileName(strFullPath As String) As String
GetFileName = Left(strFullPath, InStr(1, strFullPath, Chr(0)))
End Function