已知窗体的句柄和进程名
但是在该程序在出现错误时用TerminateProcess杀进程无效
杀不昝,只会重复弹出错误窗口!
请问各位大侠还有什么方法杀掉进程!
急求...

解决方案 »

  1.   

    VOID ExitProcess(    UINT uExitCode  // exit code for all threads  
       );
      

  2.   

    Uses TLHelp32;procedure EndProcess(AFileName: string);
    const
      PROCESS_TERMINATE = $0001;
    var
      ContinueLoop: BOOL;
      FSnapShotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
      while integer(ContinueLoop) <> 0 do
      begin
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(AFileName))
            or (UpperCase(FProcessEntry32.szExeFile ) = UpperCase(AFileName))) then
          TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
        FProcessEntry32.th32ProcessID), 0);
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
    end; AFileName是进程的名字,如WinWord.exe...
      

  3.   

    The ExitProcess function ends a process and all its threads. VOID ExitProcess(    UINT uExitCode  // exit code for all threads  
       );
     ParametersuExitCodeSpecifies the exit code for the process, and for all threads that are terminated as a result of this call. Use the GetExitCodeProcess function to retrieve the process's exit value. Use the GetExitCodeThread function to retrieve a thread's exit value.  Return ValuesThis function does not return a value.
      

  4.   

    何终止进程的运行?
    -------------------------
    (1) 使主线程的进入点函数返回(最好使用这个方法)。
    这是保证所有线程资源能够得到正确清除的唯一办法。
    让主线程的进入点函数返回,可以确保下列操作的实现:
    &#8226;该线程创建的任何C++对象将能使用它们的析构函数正确地撤消。
    &#8226;操作系统将能正确地释放该线程的堆栈使用的内存。
    &#8226;系统将进程退出代码(在进程的内核对象中维护)设为进入点函数返回值。
    &#8226;系统将进程内核对象的使用计数递减1。
    (2) 进程中的一个线程调用ExitProcess函数(应该避免使用这种方法)。
    显式调用ExitProcess和ExitThread是程序不能正确将自己清除的常见原因。调用ExitThread时,进程将继续运行,但可能会泄漏内存或其他资源。
    (3) 另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。
    只有当无法用另一种方法来迫使进程退出时,才应该使用TerminateProcess。
    (4) 进程中的所有线程自行终止运行(这种情况几乎从未发生)。
    如果进程中的所有线程全部终止运行,操作系统就认为没有理由继续保留进程的地址空间。
    一旦进程终止运行(无论采用何种方法),系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。
      

  5.   

    uses
      tlhelp32;
    procedure TForm1.Button1Click(Sender: TObject);  function KillTask(ExeFileName: string): integer;
    const
    PROCESS_TERMINATE=$0001;
    var
    ContinueLoop: BOOL;
    FSnapshotHandle: THandle;
    FProcessEntry32: TProcessEntry32;
    begin
    result := 0;
    FSnapshotHandle := CreateToolhelp32Snapshot
    (TH32CS_SNAPPROCESS, 0);
    FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
    ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
    while integer(ContinueLoop) <> 0 do
    begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(ExeFileName))
    or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(ExeFileName))) then
       Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
    end;
    end;
    begin
    killtask(edit1.text);
    end;
    其中edit1.text的内容就是已知进程名
      

  6.   

    TerminateProcess()
    不就完了吗?