通过进程快照枚举所有进程,关于进程快照,在Delphi5开发人员指南中有说明,当然也可以百度一下用法。
使用进程快照CreateToolhelp32Snapshot,必须uses TlHelp32单元。
从快照中得到的进程ID,可以获得进程的很多信息,这里不多说,网上有很多资料,具体需要什么可以百度查一下。
以这里记录一下,方便以后查找
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Memo1: TMemo; Btn1: TButton; procedure Btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses TlHelp32; // tagPROCESSENTRY32 = packed record // dwSize: DWORD; // cntUsage: DWORD; // th32ProcessID: DWORD; // 进程ID // th32DefaultHeapID: DWORD; // th32ModuleID: DWORD; // associated exe // cntThreads: DWORD; // th32ParentProcessID: DWORD; // this process's parent process // pcPriClassBase: Longint; // Base priority of process's threads // dwFlags: DWORD; // szExeFile: array[0..MAX_PATH - 1] of Char;// Path // end; // TProcessEntry32 = tagPROCESSENTRY32; procedure TForm1.Btn1Click(Sender: TObject); var hSnap: THandle; vPE: TProcessEntry32; sTmp: AnsiString; begin Memo1.Lines.Clear; hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); vPE.dwSize := SizeOf(TProcessEntry32); if Process32First(hSnap, vPE) then // Process32First找到的肯定是 [System Process] 不管 begin //如果 Process32First 函数执行成功 后使用 Process32Next 读取每个进程的信息 while Process32Next(hSnap, vPE) do begin sTmp := PAnsiChar(@vPE.szExeFile[0]); Memo1.Lines.Add(sTmp); end; end; CloseHandle(hSnap); end; end.
效果图如下:
by lin 2016-11-13