用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,也是很麻烦。

解决方案 »

  1.   

    直接用Shell调用吗?
    出错的话就结束这个进程吗?
      

  2.   

    Option ExplicitPrivate Declare Function CreateToolhelp32Snapshot Lib "kernel32" _
        (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
      

  3.   

    好像可以用shellexecute "Close",...来关闭进程
      

  4.   

    上面给你的例程中,稍作修改即可实现你的目的:检查出所有的进程的文件名,如果文件名是你调用的那个exe,则终止此进程