请问如何通过程序实现显示当前系统中所有运行进程列表?(如nt的进程管理器)(50分)

  • 主题发起人 主题发起人 xk
  • 开始时间 开始时间
以答问题里好象已经有了,你查找一下,我就不再详细讲了,
是用Delphi的ToolApi.
 
太好了,我来说。
(注意uses TLHelp32)
然后
var lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
begin
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
found := Process32First(Hand,lppe);
while found do
begin
ListBox.Items.Add(StrPas(lppe.szExeFile));//列出所有进程。
found := Process32Next(Hand,lppe);
end;
end;
 
toolapi只对95/98有效, nt下怎么办?
 
我写过一个,比你要求的复杂多了,比如还想知道该process调了那些DLL
(包括用LoadLibrary调入的),比较容易理解的描述和代码可以在下面找到:

Q175030 - HOWTO: Enumerate Applications in Win32
http://search.support.microsoft.com/searchbin/kb/search.idq?D=Support&A=T&T=B&SG=&S=F&SD=SO&T1=&FR=0&DU=C&Sz=q175030&O=Q175030
 
还有人对此问题有意见吗?
 
XK,到我的问题里去拿粉。
 
哈哈,在NT下可以通过EnumWindow找到所有顶层窗口,然后用
GetWindowThreadProcessId得到这些窗口的对应进程和线程的ID号
 
对这个问题我很感兴趣。请大家积极讨论。 谢谢了。
 
>>XK,到我的问题里去拿粉。
kao! 卖白粉的? :-P
 
呵呵,我才写了一个:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
TLHelp32, StdCtrls, Menus;

type
TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
Update1: TMenuItem;
procedure Update1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

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

implementation

{$R *.DFM}

procedure TForm1.Update1Click(Sender: TObject);
var p : pProcessInfo;
ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
memo1.Clear;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
memo1.lines.Add(p.ExeFile+' : '+inttostr(p.ProcessID));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

end.



 
接受答案了.
 
后退
顶部