我现在想做一个类似于WINDOWS任务管理器的东西,但是我现在无法关闭一个进程,我该怎么做呢,我的代码如下:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls,Tlhelp32;type
  TForm1 = class(TForm)
    Button1: TButton;
    TreeView1: TTreeView;
    Edit1: TEdit;
    Button2: TButton;
    TreeView2: TTreeView;
    procedure ProcessEnum(Sender: TObject);
    procedure kill(sender:Tobject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure Tform1.ProcessEnum(sender:Tobject);
varProcessList :Thandle;pe :TPROCESSENTRY32;node,node1 :TTreenode;processnumber :integer;procedure ModuleEnum(processid:Dword);varModuleList :Thandle;pm :TMODULEENTRY32;beginModuleList:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processID);pm.dwSize:=sizeof(TMODULEENTRY32);if module32first(ModuleList,pm)then begintreeview1.Items.addchild(node,pm.szexepath);while module32next(ModuleList,pm) dotreeview1.items.addchild(node,pm.szexepath);end;closehandle(ModuleList);end; // ModuleEnum begin // ProcessEnumprocessnumber:=0;treeview1.Items.Clear;ProcessList:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);pe.dwSize:=sizeof(TPROCESSENTRY32);if process32first(ProcessList,pe) thenbeginnode:=treeview1.Items.Add(nil,pe.szexefile);ModuleEnum(pe.th32ProcessID);inc(processnumber);while process32next(ProcessList,pe) dobeginnode:=treeview1.Items.Add(nil,pe.szexefile);
node1:=treeview2.Items.Add(nil,inttostr(pe.th32ProcessID));
ModuleEnum(pe.th32ProcessID);inc(processnumber);end;end;edit1.text:='系统进程:'+inttostr(processnumber);closehandle(ProcessList);end;procedure Tform1.kill(sender:Tobject);
varProcessList :Thandle;pe :TPROCESSENTRY32;node,node1 :TTreenode;processnumber :integer;{procedure ModuleEnum(processid:Dword);varModuleList :Thandle;pm :TMODULEENTRY32;beginModuleList:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processID);pm.dwSize:=sizeof(TMODULEENTRY32);if module32first(ModuleList,pm)then begintreeview1.Items.addchild(node,pm.szexepath);while module32next(ModuleList,pm) dotreeview1.items.addchild(node,pm.szexepath);end;closehandle(ModuleList);end; // ModuleEnum  }begin // ProcessEnumprocessnumber:=0;//treeview1.Items.Clear;ProcessList:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);pe.dwSize:=sizeof(TPROCESSENTRY32);
if process32first(ProcessList,pe) thenbegin//node:=treeview1.Items.Add(nil,pe.szexefile);//ModuleEnum(pe.th32ProcessID);inc(processnumber);while process32next(ProcessList,pe) dobegin
  if pe.szExeFile = treeview1.Selected.Text then
    begin
      TerminateProcess(pe.th32ParentProcessID,0);
      exit;
    end;
//node:=treeview1.Items.Add(nil,pe.szexefile);
//node1:=treeview2.Items.Add(nil,inttostr(pe.th32ProcessID));
//ModuleEnum(pe.th32ProcessID);inc(processnumber);end;end;edit1.text:='系统进程:'+inttostr(processnumber);closehandle(ProcessList);end;end.

解决方案 »

  1.   

    function Killpro(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;用KillProc('QQ.EXE')来杀死程序
      

  2.   

    有些进程无法关闭,
    一般的进程关闭很简单,用
    BOOL TerminateProcess(    HANDLE hProcess, // handle to the process 
        UINT uExitCode  // exit code for the process  
       );
      

  3.   

    如果在XP,2K下,有些进程是系统的,不让关闭啊,你那进程是啥名啊
      

  4.   

    我的是系统是xp可以啊!
    Killpro('你好.EXE');
    你看看任务管理器对应的程序模块是中文名还是英文名。用那个作为参数!
      

  5.   


    function SetDebugPrivilege(CanDebug: boolean): Boolean;  function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
      var
        TP: Windows.TOKEN_PRIVILEGES;
        Dummy: Cardinal;
      begin
        TP.PrivilegeCount := 1;
        LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
        if bEnable then
          TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else TP.Privileges[0].Attributes := 0;
        AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
        Result := GetLastError = ERROR_SUCCESS;
      end;
    var
      hToken: Cardinal;
    begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
      Result := EnablePrivilege(hToken, SE_DEBUG_NAME, CanDebug);
      CloseHandle(hToken);
    end;
    提高权限就能的http://lysoft.7u7.net