如何查看一个进程的进程树以及一些信息和结束进程树

解决方案 »

  1.   

    不太明白,你说得,你要的是不是Process32First()和Process32Next()?
    Delphi开发人员手册第14章有详细介绍,我给你抄段代码的主要部分,是把线程信息显示到listview的。
    procedure TWin9xInfo.FillProcessInfoList(ListView: TListView;
      ImageList: TImageList);
    var
      I: Integer;
      ExeFile: string;
      PE: TProcessEntry32;
      HAppIcon: HIcon;
    begin
      Refresh;
      ListView.Columns.Clear;
      ListView.Items.Clear;
      for I := Low(ProcessInfoCaptions) to High(ProcessInfoCaptions) do
        with ListView.Columns.Add do
        begin
          if I = 0 then Width := 285
          else Width := 75;
          Caption := ProcessInfoCaptions[I];
        end;
      for I := 0 to FProcList.Count - 1 do
      begin
        PE := PProcessEntry32(FProcList.Items[I])^;
        HAppIcon := ExtractIcon(HInstance, PE.szExeFile, 0);
        try
          if HAppIcon = 0 then HAppIcon := FWinIcon;
          ExeFile := PE.szExeFile;
          if ListView.ViewStyle = vsList then
            ExeFile := ExtractFileName(ExeFile);
          // insert new item, set its caption, add subitems
          with ListView.Items.Add, SubItems do
          begin
            Caption := ExeFile;
            Data := FProcList.Items[I];
            Add(IntToStr(PE.cntThreads));
            Add(IntToHex(PE.th32ProcessID, 8));
            Add(IntToHex(PE.th32ParentProcessID, 8));
            if ImageList <> nil then
              ImageIndex := ImageList_AddIcon(ImageList.Handle, HAppIcon);
          end;
        finally
          if HAppIcon <> FWinIcon then DestroyIcon(HAppIcon);
        end;
      end;
    end;
      

  2.   

    procedure TWin9xInfo.Refresh;
    var
      PE: TProcessEntry32;
      PPE: PProcessEntry32;
    begin
      FProcList.Clear;
      if FSnap > 0 then CloseHandle(FSnap);
      FSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if FSnap = INVALID_HANDLE_VALUE then
        raise Exception.Create('CreateToolHelp32Snapshot failed');
      PE.dwSize := SizeOf(PE);
      if Process32First(FSnap, PE) then               // get process
        repeat
          New(PPE);                                  // create new PPE
          PPE^ := PE;                                // fill it
          FProcList.Add(PPE);                        // add it to list
        until not Process32Next(FSnap, PE);           // get next process
    end;
      

  3.   

    void __fastcall TTaskMon::ShowProcess(void)
    {
    lvwProcess->Items->Clear();
    HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
         // if(hSnapshot==(HANDLE)-1)
         // {
         //   Application->MessageBox("程序运行失败", "错误",
         //       MB_OK+ MB_ICONEXCLAMATION);
         // return;
         // }
        StatusBar1->Panels->Items[0]->Text = "进程";
        StatusBar1->Panels->Items[1]->Text =
                    "选择一进程可以查看它调用的模块信息";
        char Hex[14];
        TListItem  *ListItem;
    PROCESSENTRY32 pe;
        AnsiString FileName;
        AnsiString File;
        AnsiString Path;
    pe.dwSize=sizeof(pe);
    for(int i=Process32First(hSnapshot,&pe);i;i=Process32Next(hSnapshot,&pe))
    {
            FileName=pe.szExeFile;
            if (FileName.Pos('\\')==0)
            { File=FileName;
              Path=FileName;
            }
            else
            {
                for(int i=FileName.Length();i>0;i--)
                if(FileName.IsPathDelimiter(i))
                {
                    File=FileName.SubString(i+1,FileName.Length());
                    Path=FileName.SubString(1,i);
                    break;
                }
            }
            /*
            typedef struct tagPROCESSENTRY32
    {
        DWORD   dwSize;
        DWORD   cntUsage;
        DWORD   th32ProcessID;          // this process
        ULONG_PTR th32DefaultHeapID;
        DWORD   th32ModuleID;           // associated exe
        DWORD   cntThreads;
        DWORD   th32ParentProcessID;    // this process's parent process
        LONG    pcPriClassBase;         // Base priority of process's threads
        DWORD   dwFlags;
        CHAR    szExeFile[MAX_PATH];    // Path
    }
    typedef struct tagTHREADENTRY32
    {
        DWORD   dwSize;
        DWORD   cntUsage;
        DWORD   th32ThreadID;       // this thread
        DWORD   th32OwnerProcessID; // Process this thread is associated with
        LONG    tpBasePri;
        LONG    tpDeltaPri;
        DWORD   dwFlags;
    }BOOL
    WINAPI
    Thread32First(
        HANDLE hSnapshot,
        LPTHREADENTRY32 lpte
        );BOOL
    WINAPI
    Thread32Next(
        HANDLE hSnapshot,
        LPTHREADENTRY32 lpte
        );
            */
            ListItem= lvwProcess->Items->Add();
            ListItem->Caption = File;           // 文件名
            {
                intToHex(pe.th32ProcessID,Hex);
                ListItem->SubItems->Add(Hex);       // 进程ID
            }
            {
                AnsiString Tmp(pe.pcPriClassBase);
                ListItem->SubItems->Add(Tmp);       // 进程优先权
            }
            {
                intToHex(pe.th32ParentProcessID,Hex);
                ListItem->SubItems->Add(Hex);       // 父进程ID
            }
            {
                AnsiString Tmp(pe.cntThreads);
                ListItem->SubItems->Add(Tmp);       // 创建线程个数
            }
       //     ListItem->SubItems->Add(Path);      // 文件路径
            {
                AnsiString Tmp((int)pe.th32ProcessID);
                ListItem->SubItems->Add(Tmp);       // 进程ID
            }
    }
        CloseHandle(hSnapshot);
    }
    //---------------------------------------------------------------------------
      

  4.   

    void __fastcall TTaskMon::ToolButton3Click(TObject *Sender)
    {
        if(!lvwProcess->SelCount)return;
        AnsiString ProcessID=lvwProcess->Selected->SubItems->Strings[4];
        DWORD ID=(DWORD)ProcessID.ToInt();
        HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,false,ID);
        if(hProcess!=NULL)
            if(TerminateProcess(hProcess,1))return;
        Application->MessageBoxA("操作失败","失败",MB_OK | MB_ICONERROR);
            
    }