如何在delphi中查找Windows系统中没有响应的进程及杀死这些没有响应的进程?

解决方案 »

  1.   

    查杀进程(NT/2000适用):unit Unit1;interfaceuses
     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
     ComCtrls, ExtCtrls, StdCtrls, tlhelp32;type
     TForm1 = class(TForm)
      Button1: TButton;
      ListView1: TListView;
      Button2: TButton;
      procedure Button1Click(Sender: TObject);
      procedure Button2Click(Sender: TObject);
      procedure FormCreate(Sender: TObject);
     private
      { Private declarations }
     public
      { Public declarations }
     end;var
     Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    var
     Han: THandle;
     Process: PROCESSENTRY32;
     ok: boolean;
     Rec: TListItem;
     i: integer;
    begin
     ListView1.Items.Clear;
     i := 0;
     Han := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
     Process.dwSize := SizeOf(Process);
     ok := Process32First(Han, Process);
     while ok do
     begin
      Rec := ListView1.Items.Add;
      Rec.Caption := Process.szExeFile;
      Rec.SubItems.Add(IntToStr(Process.th32ProcessID));
      i := i + 1;
      ok := Process32Next(Han, Process);
     end;end;procedure TForm1.Button2Click(Sender: TObject);
    var
     Han: THandle;
     ProcessID: int64;
     ExitCode: DWORD;
     i: integer;
    begin
     for i := 0 to ListView1.Items.Count - 1 do
      if listview1.Items[i].Selected then
      begin
       ProcessID := StrToInt64(ListView1.Selected.SubItems.Strings[0]);
       Han := OpenProcess(PROCESS_TERMINATE, true, ProcessID);
       GetExitCodeProcess(Han, ExitCode);
       TerminateProcess(Han, ExitCode);
      end;
     Sleep(100);
     Button1.Click;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     Button1Click(sender);
    end;end.
      

  2.   

    procedure KillProgram(Classname : string; WindowTitle : string); 
    const 
    PROCESS_TERMINATE = $0001; 
    var 
    ProcessHandle : THandle; 
    ProcessID: Integer; 
    TheWindow : HWND; 
    begin 
    TheWindow := FindWindow(Classname, WindowTitle); 
    GetWindowThreadProcessID(TheWindow, @ProcessID); 
    ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId); 
    TerminateProcess(ProcessHandle,4); 
    end;
      

  3.   

    都是kill进程的方法,那么楼主问的,如何判断一个程序没有响应了呢?
      

  4.   

    http://e-gotop.com/51ds/syssaver/setup.exe是不是像这个软件?
      

  5.   

    我以前好像在哪里看到过,在User32.dll中Win2k/NT下的IsHungAppWindow以一个窗口句柄作为参数可以判断目标进程是否“没有响应”。但具体没有尝试过
      

  6.   

    uses TlHelp32;procedure EndProcess(AExeName: string);
    var
      lppe: TProcessEntry32;
      found : boolean;
      Hand : THandle;
    begin
      Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
      found := Process32First(Hand,lppe);
      while found do
      begin
        if UpperCase(StrPas(lppe.szExeFile)) = UpperCase(AExeName) then
        begin
          TerminateProcess(OpenProcess(PROCESS_TERMINATE, true,
            lppe.th32ProcessID), 0);
          Exit;
        end
        else
          found := Process32Next(Hand,lppe);
      end;
    end;AExeName为要中止的进程的名字
      

  7.   

    有一个UNDOCUMENTED函数,乃是其他的解决方案,NT和9X有个USER32.DLL的函数,IsHungAppWindow(NT)和IsHungThread(9X).使用起来简便无比.下面给出原型.
    BOOL IsHungAppWindow (
             HWND hWnd, // handle to main app's window
    );BOOL IsHungThread (
     DWORD dwThreadId, // The thread's identifier of the main app's window
    );有了原型,连解释都不需要,好得不的了.:)不过调用时需要GetProcAddress.库里没有该函数.