Delphi枚舉系統進程,並檢測內存使用情況,以進度條百分比的形式顯示內存使用率,同時檢測實際內存總字節數、可用的實際內存字節數、分頁文件總字節數,虛擬內存的總字節數,可用的虛擬內存字節數等, 以下部分是對所要獲取數據項的變量定義:
dwLength: DWORD; //1.數據結構長度 dwMemoryLoad: DWORD; //2.內存使用百分比 dwTotalPhys: DWORD; //3.物理內存總字節數 dwAvailPhys: DWORD; //4.剩余的物理內存字節數 dwTotalPageFile: DWORD; //5.頁面文件總字節數 dwAvailPageFile: DWORD; //6.剩余的頁文件字節數 dwTotalVirtual: DWORD; //7.虛擬內存的總字節數 dwAvailVirtual: DWord; //8.剩余的虛擬內存字節數
以下是程序的完整代碼:
001
unit Unit1;
002
interface
003
uses
004
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
005
Dialogs, StdCtrls, ExtCtrls,mmsystem, Gauges,TLHelp32;
006
type
007
TForm1 = class(TForm)
008
Button1: TButton;
009
Memo1: TMemo;
010
Timer1: TTimer;
011
Gauge1: TGauge;
012
Gauge2: TGauge;
013
Gauge3: TGauge;
014
Label1: TLabel;
015
Label2: TLabel;
016
Label3: TLabel;
017
Label4: TLabel;
018
Button2: TButton;
019
ListBox1: TListBox;
020
procedure Button1Click(Sender: TObject);
021
procedure Timer1Timer(Sender: TObject);
022
procedure FormDestroy(Sender: TObject);
023
procedure Button2Click(Sender: TObject);
024
private
025
{ Private declarations }
026
public
027
{ Public declarations }
028
end;
029
var
030
Form1: TForm1;
031
implementation
032
{$R *.dfm}
033
procedure TForm1.Button1Click(Sender: TObject);
034
begin
035
Timer1.Enabled:=True;
036
end;
037
procedure TForm1.Timer1Timer(Sender: TObject);
038
var
039
str:String;
040
ml:TMemoryStatus;
041
begin
042
{const //完整的TMemoryStatus結構
043
GMEM_DISCARDED = $4000;
044
GMEM_LOCKCOUNT = 255;
045
type
046
PMemoryStatus = ^TMemoryStatus;
047
_MEMORYSTATUS = record
048
dwLength: DWord; //1.數據結構長度
049
dwMemoryLoad: DWord; //2.內存使用百分比
050
dwTotalPhys: DWord; //3.物理內存總字節數
051
dwAvailPhys: DWord; //4.剩余的物理內存字節數
052
dwTotalPageFile: DWord; //5.頁面文件總字節數
053
dwAvailPageFile: DWord; //6.剩余的頁文件字節數
054
dwTotalVirtual: DWord; //7.虛擬內存的總字節數
055
dwAvailVirtual: DWord; //8.剩余的虛擬內存字節數
056
end;
057
TMemoryStatus = _MEMORYSTATUS;
058
MEMORYSTATUS = _MEMORYSTATUS;
059
}
060
GlobalMemoryStatus(ml);
061
str:='數據結構長度:'+IntToStr(ml.dwLength)+#13#10
062
+'內存使用百分比:'+IntToStr(ml.dwMemoryLoad)+'%'+#13#10
063
+'實際內存總字節數 :'+FormatFloat('###,###',ml.dwTotalPhys)+#13#10
064
+'可用的實際內存字節數:'+FormatFloat('###,###',ml.dwAvailPhys)+#13#10
065
+'分頁文件總字節數 :'+FormatFloat('###,###',ml.dwTotalPageFile)+#13#10
066
+'分頁文件可用字節數 :'+FormatFloat('###,###',ml.dwAvailPageFile)+#13#10
067
+'虛擬內存的總字節數 :'+FormatFloat('###,###',ml.dwTotalVirtual)+#13#10
068
+'可用的虛擬內存字節數:'+FormatFloat('###,###',ml.dwAvailVirtual)+#13#10;
069
Memo1.Lines.Clear;
070
Memo1.Lines.Add(str);
071
//進度條顯示方式
072
Gauge1.Progress:=Round((1-ml.dwAvailPhys/ml.dwTotalPhys)*100); //
073
Gauge2.Progress:=Round((1-ml.dwAvailPageFile/ml.dwTotalPageFile)*100);
074
Gauge3.Progress:=Round((1-ml.dwAvailVirtual/ml.dwTotalVirtual)*100);
075
end;
076
077
procedure TForm1.FormDestroy(Sender: TObject);
078
begin
079
Timer1.Enabled:=False; //程序退出時關閉Timer1
080
end;
081
082
procedure TForm1.Button2Click(Sender: TObject);
083
var lppe: TProcessEntry32;
084
{ tagPROCESSENTRY32 = packed record
085
dwSize: DWord; //指定該結構的大小
086
cntUsage: DWord; //進程的參照數
087
th32ProcessID: DWord; //當前進程標志符
088
th32DefaultHeapID: DWord; //當前進程的默認堆棧標志符
089
th32ModuleID: DWord; //當前進程的模塊標志符
090
cntThreads: DWord; //進程激活的執行線程數
091
th32ParentProcessID: DWord; //創建進程的父進程標志符
092
pcPriClassBase: Longint; //基礎優先類
093
dwFlags: DWord; //保留類,未使用
094
szExeFile: array[0..MAX_PATH - 1] of Char;// 進程相關的文件名
095
end;
096
}
097
found : boolean;
098
Hand : THandle;
099
begin
100
ListBox1.Clear;
101
ListBox1.Items.Add('進程名________進程ID');
102
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); //創建一個進程快照
103
found := Process32First(Hand,lppe); //獲取第一個進程
104
while found do
105
begin
106
ListBox1.Items.Add(lppe.szExeFile+'__________'+IntToStr(lppe.th32ProcessID));//列出所有進程。
107
found := Process32Next(Hand,lppe); //不斷的獲取下一個進程
108
end;
109
Caption:='進程總數:'+IntToStr(listBox1.Items.Count-1); //得到進程總數
110
end;
111
end.
程序運行最終效果運行截圖:
