📄 unit1.~pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
PsAPI, StdCtrls,
tlhelp32;
type
TForm1 = class(TForm)
btn1: TButton;
edtProcessName: TEdit;
mmo1: TMemo;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
//uses tlhelp32;
//获得一个进程的所属可执行文件的路径
function GetExePathByProcessID(PID: DWord): String;
var
snap: THandle;
me32: TMODULEENTRY32;
begin
snap := 0;
result := '';
try
snap := CreateToolhelp32Snapshot(TH32CS_SNAPALL,PID);
if snap <> 0 then
begin
me32.dwSize:= SizeOf(TMODULEENTRY32);
if Module32First(snap, me32) then
begin
if me32.th32ProcessID = PID then
begin
result:= me32.szExePath;
exit;
end else
while Module32Next(snap, me32) do
if me32.th32ProcessID = PID then
begin
result:= me32.szExePath;
break;
end;
end;
end;
finally
CloseHandle(snap);
end;
end;
// Added by Zhangsk 2009-3-3 14:38:21
function GetMemorySizeByProcessID(PID: DWord): Cardinal;
var
l_nTmpHandle: HWND;
l_pPMC: PPROCESS_MEMORY_COUNTERS;
l_pPMCSize: Cardinal;
begin
l_pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);
GetMem(l_pPMC, l_pPMCSize);
l_pPMC^.cb := l_pPMCSize;
l_nTmpHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if (GetProcessMemoryInfo(l_nTmpHandle, l_pPMC, l_pPMCSize)) then
Result := l_pPMC^.WorkingSetSize
else
Result := 0;
FreeMem(l_pPMC);
end;
function GetPIDByMainFormCaption(MainFormCaption: string): DWORD;
var
l_nWndHandle: HWND;
begin
l_nWndHandle := FindWindow(nil, PChar(MainFormCaption));
if l_nWndHandle = 0 then
begin
Result := 0;
Exit;
end;
GetWindowThreadProcessId(l_nWndHandle, @Result);
end;
//http://hi.baidu.com/83925com/blog/item/401e4923e4cd7c489258078d.html
function GetProcessMemorySize(_sProcessName: string; var _nMemSize: Cardinal): Boolean;
var
l_nWndHandle, l_nProcID, l_nTmpHandle: HWND;
l_pPMC: PPROCESS_MEMORY_COUNTERS;
l_pPMCSize: Cardinal;
begin
//目前是通过目标程序主窗体的caption属性值查找其句柄,然后根据句柄找到进程的PID
l_nWndHandle := FindWindow(nil, PChar(_sProcessName));
{ TODO -oZhangsk -c : 通过映象名称查找PID 2009-3-3 14:20:28 }
if l_nWndHandle = 0 then
begin
Result := False;
Exit;
end;
l_pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);
GetMem(l_pPMC, l_pPMCSize);
l_pPMC^.cb := l_pPMCSize;
GetWindowThreadProcessId(l_nWndHandle, @l_nProcID);
l_nTmpHandle := OpenProcess(PROCESS_ALL_ACCESS, False, l_nProcID);
if (GetProcessMemoryInfo(l_nTmpHandle, l_pPMC, l_pPMCSize)) then
_nMemSize := l_pPMC^.WorkingSetSize
else
_nMemSize := 0;
FreeMem(l_pPMC);
Result := True;
//GetModuleFileName
end;
//Beispiel
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
l_nSize: Cardinal;
begin
if (GetProcessMemorySize(edtProcessName.Text, l_nSize)) then
ShowMessage('Size: ' + IntToStr(l_nSize) + ' byte')
else
ShowMessage('Error');
end;
procedure TForm1.btn2Click(Sender: TObject);
var
Pid: DWORD;
MemorySize: DWORD;
begin
Pid := GetPIDByMainFormCaption(edtProcessName.Text);
MemorySize := GetMemorySizeByProcessID(Pid);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -