如何枚举系统进程及进程相关信息(如CPU占用率,内存占用等等)?(100分)

T

taibu

Unregistered / Unconfirmed
GUEST, unregistred user!
从网上找到下面方法,但不成功,不知问题在哪,各位还有其它更好的方法吗?
function TForm1.EnumProcessNT(var ProcArray: TProcessNTArray): Integer;
var
i : Integer;
Count : DWORD;
ProcHand : THandle;
ModHand : HMODULE;
pList : array of DWORD;
ModName : array[0..MAX_PATH] of char;
BigArray : array[0..$3FFF-1] of DWORD; //大数组,因为不知道能预分配内存大小
begin
if not EnumProcesses(@BigArray,SizeOf(BigArray),Count) then raise Exception.Create('sFailMessage');
Result := Count Div SizeOf(DWORD);
SetLength(pList,Result);
Move(BigArray,pList[0],Count);
SetLength(ProcArray,Result);
for i:= low(pList) to High(pList) do
begin
procHand := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False,pList);
if procHand >0 then
try
EnumProcessModules(ProcHand,@ModHand,1, Count);
if GetModuleFileName(ProcHand,ModName, SizeOf(ModName))>0 then
with ProcArray do
begin
pID := pList;
szExeFile := strPas(ModName);
pHandle := ProcHand;
pPriClass := GetPriorityClass(ProcHand);
end;
finally
CloseHandle(procHand);
end;
end;
end;
 
首先我们应该调用CreateToolhelp32Snapshot创建快照;然后调用Process32First,把创建的快照的句柄传递给hSnapshot参数,函数成功返回后我们将在lppe参数中得到第一个进程的信息;继续调用Process32Next,我们将得到后续的进程信息,直到Process32Next返回False为止。记住最后我们应该调用CloseHandle把快照的句柄安全的释放。

是不是很简单?下面是范例的源程序,为了简单起见,我只写了关键的语句。

uses ... TLHelp32, ... // 需要用到TLHelp32单元即Toolhelp API library.

type
TForm1 = class(TForm)
...
end;

var
Form1: TForm1;
MyProcess : Tlist; // 返回的进程信息在MyProcess这个TList中。

type
TProcessInfo = Record
ExeFile : String;
ProcessID : DWORD;
end;
pProcessInfo = ^TProcessInfo;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
p : pProcessInfo;
IsLoopContinue:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
MyProcess := TList.Create; // 保存进程信息的列表
MyProcess.Clear; // 初始化列表
FSnapshotHandle:=
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); // 创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32); // 必须先设置结构的大小
IsLoopContinue:=
Process32First(FSnapshotHandle,FProcessEntry32); //得到第一个进程信息
while integer(IsLoopContinue)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
MyProcess.Add(p); // 添加进程信息
IsLoopContinue:=Process32Next(FSnapshotHandle,FProcessEntry32); // 继续枚举
end;
CloseHandle(FSnapshotHandle); // 释放快照句柄
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
p : pProcessInfo;
i : integer;
begin
With MyProcess do
for i := Count - 1 DownTo 0 do
begin
p := items;
Dispose(p); // 清除动态分配的内存
Delete(i); // 删除列表中的项
end;
end;

...

end.
《Delphi下深入Windows核心编程》这本书里有介绍。
 
我上面那种方法有谁能帮我改改?
 
use TLHelp32,Shellapi
试一下。
 
如何获取CPU占用率,内存占用等等
 
接受答案了.
 
顶部