平时看到的资料都是要先获得进程句柄,再通过句柄将进程结束,我想问问有没有办法不用获得句柄,而直接通过进程名称把进程结束掉的办法。知道的大虾回个贴,谢谢了!!!

解决方案 »

  1.   

    需要用API结束进程的话就一定要有句柄!
    不需要句柄结束进程的那不是API,而是用Shell运行的一个外部程序,Windows自带
      

  2.   

    原来用API一定要有句柄的,楼上的是否能给个用shel结束进程的列子,谢谢了!!!
      

  3.   

    taskkill.exe程序!在命令解释程序(cmd.exe)中输入:taskkill /?
    可以得到帮助。
      

  4.   

    纠正一下楼上的小错误, 那个微软提供的小程序的文件名是tskill.exe
      

  5.   

    刚刚试了一下,taskkill存在~
    tskill也存在~不过帮助内容不相同。
      

  6.   

    没找到,郁闷.估计又是个不结帖的~~~~那我再贴一次吧:以下代码复制到一个新建的标准模块里并保存为ModFindProcess.bas:'*************************************************************************
    '**模 块 名:ModFindProcess
    '**说    明:进程相关操作
    '**创 建 人:马大哈 http://www.m5home.com/
    '**日    期:2006年3月18日
    '**日    期:2007年1月23日
    '**描    述:改进了结束进程的条件,可以根据PID来结束
    '**版    本:V1.3
    '*************************************************************************
    Option ExplicitPrivate 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 OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPrivate Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const TH32CS_SNAPPROCESS As Long = 2&
    Private Const PROCESS_TERMINATE = 1Private Type PROCESSENTRY32
        dwSize As Long
        cntUsage As Long
        th32ProcessID As Long
        th32DefaultHeapID As Long
        th32ModuleID As Long
        cntThreads As Long
        th32ParentProcessID As Long
        pcPriClassBase As Long
        dwFlags As Long
        szexeFile As String * 260
    End TypePrivate Type MyProcess
        ExeName As String
        PID As Long
    End TypePublic Function CloseProcess(Optional ByVal ProName As String, Optional ByVal PID As Long) As Integer
        '传入进程名或PID,结束相应进程
        Dim tPID As Long
        Dim tPHwnd As Long
        Dim ProArr() As String, PIDArr() As Long
        Dim I As Long
        
        Call ListProcess(ProArr, PIDArr)
        For I = 1 To UBound(ProArr)
            If PIDArr(I) = PID Or ProArr(I) = ProName Then      '配对进程ID或进程名
                Exit For
            End If
        Next I
        
        If I > UBound(PIDArr) Then Exit Function
        tPID = PIDArr(I)
        
        tPHwnd = OpenProcess(PROCESS_TERMINATE, False, tPID)
        Debug.Print tPHwnd
        If tPHwnd Then
            CloseProcess = TerminateProcess(tPHwnd, 0)
        End If
    End FunctionPublic Function FindProcess(ByVal ProName As String, Optional ByRef PID As Long) As Boolean
        '传入进程名,如果进程存在,在PID里返回进程ID,函数返回True,否则返回Flase
        'ProName: 指定进程名
        'PID: 如果进程名存在,返回其PID
        '返回值: 进程名存在返回TRUE,否则返回FALSE
        Dim ProArr() As String, PIDArr() As Long
        Dim I As Long
        
        Call ListProcess(ProArr, PIDArr)
        For I = 1 To UBound(ProArr)
            If ProArr(I) = ProName Then
                PID = PIDArr(I)
                FindProcess = True
                Exit For
            End If
        Next I
    End FunctionPublic Function ListProcess(ByRef ProExeName() As String, ByRef ProPid() As Long)
        '列出进程以及相应PID
        'ProExeName(): 进程名
        'ProPid(): 相应的PID
        Dim MyProcess As PROCESSENTRY32
        Dim mySnapshot As Long
        Dim ProData() As MyProcess
        Dim I As Long
        
        ReDim ProData(0)
        
        MyProcess.dwSize = Len(MyProcess)
        mySnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)
        ProcessFirst mySnapshot, MyProcess
        
        ReDim Preserve ProData(UBound(ProData) + 1)
        
        ProData(UBound(ProData)).ExeName = Left(MyProcess.szexeFile, InStr(MyProcess.szexeFile, Chr(0)) - 1)
        ProData(UBound(ProData)).PID = MyProcess.th32ProcessID
        
        'Debug.Print ProData(UBound(ProData)).ExeName
        
        MyProcess.szexeFile = ""
        
        While ProcessNext(mySnapshot, MyProcess)
            ReDim Preserve ProData(UBound(ProData) + 1)
            
            ProData(UBound(ProData)).ExeName = Left(MyProcess.szexeFile, InStr(MyProcess.szexeFile, Chr(0)) - 1)
            ProData(UBound(ProData)).PID = MyProcess.th32ProcessID
            
        '    Debug.Print ProData(UBound(ProData)).ExeName
            
            MyProcess.szexeFile = ""
        Wend
        
        ReDim ProExeName(UBound(ProData))
        ReDim ProPid(UBound(ProData))
        
        For I = 1 To UBound(ProData)
            With ProData(I)
                ProExeName(I) = .ExeName
                ProPid(I) = .PID
            End With
        Next I
    End Function
    使用很简单,如下:If FindProcess("qq.exe") = True Then
        MsgBox "qq.exe存在!结束之."
        CloseProcess "qq.exe"
    End If以上代码仅是测试用,小心点啊哈哈,记得改文件名为其它,如记事本之类...不然QQ消失了可别怪我没说:)
      

  7.   

    楼上的好像太夸张了一点,结束一个进程用得着这么长一串代码吗?
    我看我还是用“OpenProcess”加“TerminateProcess”两个API搞定算了。
    多谢各位了!!!
      

  8.   

    http://topic.csdn.net/u/20080214/14/33027c95-a0fc-4b6f-b5a8-974cef72a50a.html
      

  9.   

    我问个比较钝的问题呵呵
    我的MSDN是6。0的,怎么没那个ProcessFirst函数?还有用VB声明API的加在工具也没这个函数,能告诉我在哪有这个函数的说明么?
      

  10.   

    Declare Function SetComputerName Lib "kernel32" Alias "SetComputerNameA" (ByVal lpComputerName As String) As Long
    这里的Declare Function SetComputerName 是声明一个函数名为 SetComputerName的函数
    而 Lib "kernel32" Alias "SetComputerNameA"是说直接调用kernel32(即C:\WINDOWS\SYSTEM32\kernel32.DLL)中的SetComputerNameA函数。
    知道了没。意思就是说老马的那一句:Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long就声明了一个函数 叫ProcessFirst
      

  11.   

    哦~你好象没太懂我的意思。我是说要ProcessFirst这个函数的帮助文档。给个连接
      

  12.   

    你到www.msdn.com上搜一下不就知道了吗?
      

  13.   

    '例如你是监测 QQ 的运行, 便自动终止进程 (当然你也可以用窗口标题来查找exe名称或句柄)'添加 Command1Option Explicit
    Dim procname$, rtn&, Tmpstr$
    Dim objWMIService, colProcessList, objProcessPrivate Sub Command1_Click()
       procname = "qq.exe"
       Tmpstr = "."
       Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & Tmpstr & "\root\cimv2")
       Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & procname & "'")
       If colProcessList.Count > 0 Then
          For Each objProcess In colProcessList
             rtn = MsgBox("您确定要终止 " & procname & " 吗?", vbYesNo, "强制关闭进程")
             If rtn = 6 Then objProcess.Terminate
          Next
       End If
    End Sub
     
      

  14.   

    shell "ntsd -c q -pn qq.exe"
    给你一个简单的吧,XP系统ok
      

  15.   

    参考一下这个帖子吧http://download.csdn.net/source/358139
      

  16.   

    QQ存在,但是不能结束之啊。//注意一下杀毒软件....QQ进程是一个强保护的进程,我现在如果要结束,瑞星也马上会说XX进程访问权限违规....换别的进程吧
      

  17.   

    chenhui530 要1千万分?元?
    都是一个很高的要求啊
      

  18.   

    多谢各位这么热心,答案应该不算完全正确吧!这个估计只能怪微软没能提供一个这样的API了.