已获得一个进程的pid,如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!(就是在系统的任务管理器中可以观看到的每个进程的所有信息)

解决方案 »

  1.   

    参考:
    http://delphi.bibts.com/CPU-t926883.htm
    那里有一些源码
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls, ImgList, TLHelp32, Menus, ShellApi;type  TForm1 = class(TForm)
        Panel1: TPanel;
        ListView1: TListView;
        PopupMenu1: TPopupMenu;
        EndProcess1: TMenuItem;
        ImageList1: TImageList;
        procedure FormShow(Sender: TObject);
        procedure EndProcess1Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure ShowProcess;
      end;var
      Form1: TForm1;implementation{$R *.dfm}function EnumProcesses(lpidProcess,cb,cbNeeded:dword):integer;stdcall;external 'PSAPI.DLL';
    function EnumProcessModules(hProcess:THandle;lphModule:HMODULE;cb,lpcbNeeded:Dword):integer;stdcall;external 'PSAPI.DLL';
    function GetModuleFileNameExA(hProcess:THandle;hModule:HMODULE;lpFilename:pchar;nSize:DWord):integer;stdcall;external   'PSAPI.DLL';procedure TForm1.ShowProcess;
    var
      ProcessStruct:ProcessEntry32;
      ProcessHandle,HProcess:THandle;
      Pb:Boolean;
      FileName:array[0..1024] of char;
      hMods:array [0..1024] of DWORD;
      cbNeeded,cMod:DWORD;
      SHFileInfo:TSHFILEINFO;
      Icon:TIcon;begin
      ListView1.Clear;
      ImageList1.Clear;
      ProcessHandle:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
      ProcessStruct.dwSize:=SizeOf(ProcessStruct);
      Pb:=Process32First(ProcessHandle,ProcessStruct);
      while Pb do
      begin
        ListView1.Items.Add;
        ListView1.Items[ListView1.Items.Count-1].Caption:=ExtractFileName(ProcessStruct.szExeFile);
        ListView1.Items[ListView1.Items.Count-1].SubItems.Add(inttostr(ProcessStruct.th32ProcessID));
        HProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessStruct.th32ProcessID);
        ListView1.Items[ListView1.Items.Count-1].SubItems.Add(inttostr(HProcess));    if EnumProcessModules(hProcess,dword(@hMods),sizeof(hMods),dword(@cbNeeded))<>0 then
        begin
          GetModuleFileNameExA(hProcess,cMod,FileName,sizeof(FileName));
        end;    //Get Icon
        try
          SHGetFileInfo(FileName,FILE_ATTRIBUTE_NORMAL,SHFileInfo,SizeOf(SHFileInfo), SHGFI_SMALLICON or SHGFI_ICON);
          Icon:=TIcon.Create;
          try
            Icon.Handle:=SHFileInfo.hIcon;
            ImageList1.AddIcon(Icon);
            ListView1.Items[ListView1.Items.Count-1].ImageIndex:=ImageList1.Count -1;
          finally
            Icon.Free;
          end;
        except
        end;    ListView1.Items[ListView1.Items.Count-1].SubItems.Add(FileName);    Pb:=Process32Next(ProcessHandle,ProcessStruct);
        CloseHandle(HProcess);  end;
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      ShowProcess;
    end;procedure TForm1.EndProcess1Click(Sender: TObject);
    var
      hKill:integer;
    begin
      if ListView1.Selected <> nil then
      begin
        hKill:=OpenProcess(PROCESS_TERMINATE,False,strtoint(ListView1.Selected.SubItems.Strings[0]));
        TerminateProcess(hKill,0);
        CloseHandle(hKill);
        ShowProcess;
      end;
    end;end.
      

  3.   

    上面的功能我实现了,我能枚举出来进程获得进程id,但是获取不到其他的信息:cpu占用、内存占用、虚拟内存占用等,请高手们帮帮忙啊!!!
      

  4.   

    用PED表查询啊!"如何获得某时刻该进程占用的CPU、内存、虚拟内存、句柄数等信息!"
    可是这不能得到隐藏进程的进程占用的CPU、内存、虚拟内存、句柄数等信息!"