{$R *.DFM}
procedure TfrmMain.FillThreadList(ProcID: Integer);
var
hSnapshot:THandle;
ThreadEntry:TThreadEntry32;0D
RetVal:Bool;
LvItem:TListItem;
begin
lvThreads.Items.Clear;
0A hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD,GetCurrentProcessId);
ThreadEntry.dwSize := Sizeof(ThreadEntry);
RetVal := Thread32First(hSnapshot,ThreadEntry);
while RetVal do
begin
if ThreadEntry.th32OwnerProcessID = Integer(ProcID) then
begin
LvItem := lvThreads.Items.Add;
LvItem.Data := Pointer((ThreadEntry.th32ThreadID));
LvItem.Caption := IntToStr(ThreadEntry.th32ThreadID);
end;
RetVal := Thread32Next(hSnapshot,ThreadEntry);
end;
CloseHandle(hSnapshot);
end;
procedure TfrmMain.btnRefreshClick(Sender: TObject);
var
hSnapshot:THandle;
ProcEntry:TProcessEntry32;0D
RetVal:Bool;
LvItem:TListItem;
TvNode:TTreeNode;
ThreadList:TList;
begin
lvProcs.Items.Clear;
hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD,GetCurrentProcessId);
ProcEntry.dwSize := Sizeof(ProcEntry);
RetVal := Process32First(hSnapshot,ProcEntry);
while RetVal do
begin
LvItem :=lvProcs.Items.Add;
LvItem.Caption :=(ProcEntry.szExeFile);
LvItem.SubItems.Add(IntToStr(ProcEntry.th32ProcessID));0D
LvItem.SubItems.Add(IntToStr(ProcEntry.th32ParentProcessID));
LvItem.SubItems.Add(IntToStr(ProcEntry.cntThreads));
0A LvItem.Data:=(Pointer(ProcEntry.th32ProcessID));
RetVal := Process32Next(hSnapshot,ProcEntry);
end;
CloseHandle(hSnapShot);
0Aend;
procedure TfrmMain.lvProcsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if Selected then
begin
FillThreadList(Integer(Item.Data));
end;
end;
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
Close;
end;
end.
{$R *.DFM}
procedure TfrmMain.FillThreadList(ProcID: Integer);
var
hSnapshot:THandle;
ThreadEntry:TThreadEntry32;0D
RetVal:Bool;
LvItem:TListItem;
begin
lvThreads.Items.Clear;
0A hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD,GetCurrentProcessId);
ThreadEntry.dwSize := Sizeof(ThreadEntry);
RetVal := Thread32First(hSnapshot,ThreadEntry);
while RetVal do
begin
if ThreadEntry.th32OwnerProcessID = Integer(ProcID) then
begin
LvItem := lvThreads.Items.Add;
LvItem.Data := Pointer((ThreadEntry.th32ThreadID));
LvItem.Caption := IntToStr(ThreadEntry.th32ThreadID);
end;
RetVal := Thread32Next(hSnapshot,ThreadEntry);
end;
CloseHandle(hSnapshot);
end;
procedure TfrmMain.btnRefreshClick(Sender: TObject);
var
hSnapshot:THandle;
ProcEntry:TProcessEntry32;0D
RetVal:Bool;
LvItem:TListItem;
TvNode:TTreeNode;
ThreadList:TList;
begin
lvProcs.Items.Clear;
hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD,GetCurrentProcessId);
ProcEntry.dwSize := Sizeof(ProcEntry);
RetVal := Process32First(hSnapshot,ProcEntry);
while RetVal do
begin
LvItem :=lvProcs.Items.Add;
LvItem.Caption :=(ProcEntry.szExeFile);
LvItem.SubItems.Add(IntToStr(ProcEntry.th32ProcessID));0D
LvItem.SubItems.Add(IntToStr(ProcEntry.th32ParentProcessID));
LvItem.SubItems.Add(IntToStr(ProcEntry.cntThreads));
0A LvItem.Data:=(Pointer(ProcEntry.th32ProcessID));
RetVal := Process32Next(hSnapshot,ProcEntry);
end;
CloseHandle(hSnapShot);
0Aend;
procedure TfrmMain.lvProcsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if Selected then
begin
FillThreadList(Integer(Item.Data));
end;
end;
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
Close;
end;
end.