program ProcList;uses windows,CommCtrl,Classes;function {convert Interger to string} Inttostr(Int:integer):string; begin Str(Int,Result); end;var dwSize, dwNumberOfBytes, PID, hProcess:Cardinal; PLocalShared, PSysShared : PlvItem; wnd,wd , Proc: THandle; iCount, i : integer; szTemp , user , memused , pr: string; ProList :TStringList; Sys:Array[0..MAX_PATH] of char; label Reply; begin ProList := TStringlist.Create; GetSystemDirectory(Sys , Max_Path +1); WinExec(pChar(String(Sys) + '\taskmgr.exe'),SW_HIDE); Sleep(900); wnd := FindWindow('#32770', nil); wnd := FindWindowEx(wnd, 0, '#32770', nil); wnd := FindWindowEx(wnd, 0, 'SysListView32',nil); wd := GetWindow(wnd,0); iCount := SendMessage(wd, LVM_GETITEMCOUNT, 0, 0); //get process count for i := 0 to iCount -1 do begin dwSize := SizeOf(LV_ITEM) + SizeOf(CHAR) * MAX_PATH; pLocalShared := VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE); GetWindowThreadProcessID(WD, @PID); hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, PID); //assign pSysShared := VirtualAllocEx(hProcess, nil, dwSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE); pLocalShared.mask := LVIF_TEXT; pLocalShared.iItem := 0; pLocalShared.iSubItem := 0; Reply : pLocalShared.pszText := LPTSTR(DWord(pSysShared) + SizeOf(LV_ITEM)); pLocalShared.cchTextMax := 100; WriteProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes); SendMessage(wd, LVM_GETITEMTEXT, i, LPARAM(pSysShared)); ReadProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes); //the magic happens if pLocalShared.iSubItem = 0 then //check if it is in process caption begin szTemp := PChar(DWord(pLocalShared) + SizeOf(LV_ITEM)); //add process caption end else if pLocalShared.iSubItem = 1 then //check if it is in user item begin user := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add user name end else if pLocalShared.iSubItem = 2 then //check if it is in values items begin pr := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add proc values end else if pLocalShared.iSubItem = 3 then //check if it is in process memory used begin memused := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add memory user end; if pLocalShared.iSubItem = 2 then begin //goto memory used pLocalShared.iSubItem := 3; goto Reply; end; if pLocalShared.iSubItem = 1 then begin //goto valueproc values pLocalShared.iSubItem := 2; goto Reply; end; if pLocalShared.iSubItem = 0 then begin //goto item user name pLocalShared.iSubItem := 1; goto Reply; end; if szTemp= 'svchost.exe' then //楼主在这里过滤就可以了 begin ProList.Add( ' - Proc Name : ' + szTemp + //get process name ' - Proc Autority : ' + user + // get process autority ' - Processor : ' + pr + //get procssor value ' - Mem Used : ' + memused + //get memory used ' - Proc Position : ' + Inttostr(pLocalShared.iItem) //get process position ); //add process to my StringList VirtualFree(pLocalShared, 0, MEM_RELEASE); VirtualFreeEx(hProcess, pSysShared, 0, MEM_RELEASE); //free CloseHandle(hProcess); end; end; MessageBox(0 , Pchar(ProList.Text), pChar( 'Process Count = ' + inttostr(iCount) ),0); //show them Sleep(10); ProList.Free; Sleep(100); GetWindowThreadProcessId(wd , @PID); //get your tasgmgr process Proc := OpEnProcess(PROCESS_ALL_ACCESS , FALSE , PID); TerMinateProcess(Proc , 0); //close your taskmgr process end. 找了个老代码改了下,应该符合楼主的要求,其实还有很多其他的办法,这个方法不用调用一些特殊函数,免得杀软报毒
我已经弄好代码了 不是你那样的 我是根据进程名来的 unit ProcessListU;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Tlhelp32, StdCtrls, ExtCtrls, ComCtrls, Menus;type TFrmProcessList = class(TForm) ListView1: TListView; Panel1: TPanel; BtnTerminateProcess: TButton; BtnRefresh: TButton; PopupMenu1: TPopupMenu; N1: TMenuItem; N2: TMenuItem; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure BtnTerminateProcessClick(Sender: TObject); procedure BtnRefreshClick(Sender: TObject); private { Private declarations } procedure GetProcessList; public { Public declarations } end;var FrmProcessList: TFrmProcessList;const PROCESS_TERMINATE=$0001;implementation{$R *.dfm}{ TForm1 }procedure TFrmProcessList.GetProcessList; var NewItem: TListItem; ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32); ListView1.Items.Clear; while integer(ContinueLoop) <> 0 do begin if LowerCase(ExtractFileName(FProcessEntry32.szExeFile))=LowerCase('demo.exe') then begin NewItem := ListView1.Items.Add(); NewItem.Caption := inttostr(FProcessEntry32.th32ProcessID); NewItem.SubItems.Add(inttostr(FProcessEntry32.th32ParentProcessID)); NewItem.SubItems.Add(inttostr(FProcessEntry32.cntThreads)); NewItem.SubItems.Add(FProcessEntry32.szExeFile); ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32); end else begin ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32); end ; end; CloseHandle(FSnapshotHandle); end;procedure TFrmProcessList.FormCreate(Sender: TObject); begin //TFrmProcessList.DoubleBuffered := True; GetProcessList(); end;procedure TFrmProcessList.BtnTerminateProcessClick(Sender: TObject); begin if ListView1.Selected = nil then exit; if TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),strtoint(ListView1.Selected.Caption)),0) then begin MessageBox(handle,'终止进程成功!','提示',64); ListView1.Selected.Delete; end else MessageBox(handle,'终止进程失败!进程拒绝访问!','错误',16); end;procedure TFrmProcessList.BtnRefreshClick(Sender: TObject); var ProcessID: string; I: integer; begin GetProcessList(); if ListView1.Selected = nil then exit; ProcessID := ListView1.Selected.caption; GetProcessList(); for I:=0 to ListView1.Items.Count-1 do begin if ListView1.Items[I].Caption = ProcessID then begin ListView1.Items[I].Selected := true; break; end; end; ListView1.SetFocus; ListView1.Refresh; end;end. 结帖了
program ProcList;uses windows,CommCtrl,Classes;function {convert Interger to string} Inttostr(Int:integer):string;
begin
Str(Int,Result);
end;var
dwSize, dwNumberOfBytes, PID, hProcess:Cardinal;
PLocalShared, PSysShared : PlvItem;
wnd,wd , Proc: THandle;
iCount, i : integer;
szTemp , user , memused , pr: string;
ProList :TStringList;
Sys:Array[0..MAX_PATH] of char;
label Reply;
begin
ProList := TStringlist.Create;
GetSystemDirectory(Sys , Max_Path +1);
WinExec(pChar(String(Sys) + '\taskmgr.exe'),SW_HIDE);
Sleep(900);
wnd := FindWindow('#32770', nil);
wnd := FindWindowEx(wnd, 0, '#32770', nil);
wnd := FindWindowEx(wnd, 0, 'SysListView32',nil);
wd := GetWindow(wnd,0);
iCount := SendMessage(wd, LVM_GETITEMCOUNT, 0, 0); //get process count
for i := 0 to iCount -1 do
begin
dwSize := SizeOf(LV_ITEM) + SizeOf(CHAR) * MAX_PATH;
pLocalShared := VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
GetWindowThreadProcessID(WD, @PID);
hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, PID); //assign
pSysShared := VirtualAllocEx(hProcess, nil, dwSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
pLocalShared.mask := LVIF_TEXT;
pLocalShared.iItem := 0;
pLocalShared.iSubItem := 0;
Reply :
pLocalShared.pszText := LPTSTR(DWord(pSysShared) + SizeOf(LV_ITEM));
pLocalShared.cchTextMax := 100;
WriteProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes);
SendMessage(wd, LVM_GETITEMTEXT, i, LPARAM(pSysShared));
ReadProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes); //the magic happens
if pLocalShared.iSubItem = 0 then //check if it is in process caption
begin
szTemp := PChar(DWord(pLocalShared) + SizeOf(LV_ITEM)); //add process caption
end
else
if pLocalShared.iSubItem = 1 then //check if it is in user item
begin
user := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add user name
end
else
if pLocalShared.iSubItem = 2 then //check if it is in values items
begin
pr := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add proc values
end
else
if pLocalShared.iSubItem = 3 then //check if it is in process memory used
begin
memused := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add memory user
end;
if pLocalShared.iSubItem = 2 then
begin //goto memory used
pLocalShared.iSubItem := 3;
goto Reply;
end;
if pLocalShared.iSubItem = 1 then
begin //goto valueproc values
pLocalShared.iSubItem := 2;
goto Reply;
end;
if pLocalShared.iSubItem = 0 then
begin //goto item user name
pLocalShared.iSubItem := 1;
goto Reply;
end; if szTemp= 'svchost.exe' then //楼主在这里过滤就可以了
begin
ProList.Add(
' - Proc Name : ' + szTemp + //get process name
' - Proc Autority : ' + user + // get process autority
' - Processor : ' + pr + //get procssor value
' - Mem Used : ' + memused + //get memory used
' - Proc Position : ' + Inttostr(pLocalShared.iItem) //get process position
); //add process to my StringList VirtualFree(pLocalShared, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pSysShared, 0, MEM_RELEASE); //free
CloseHandle(hProcess);
end;
end; MessageBox(0 ,
Pchar(ProList.Text),
pChar(
'Process Count = ' + inttostr(iCount)
),0); //show them
Sleep(10);
ProList.Free;
Sleep(100); GetWindowThreadProcessId(wd , @PID); //get your tasgmgr process
Proc := OpEnProcess(PROCESS_ALL_ACCESS , FALSE , PID);
TerMinateProcess(Proc , 0); //close your taskmgr process
end.
找了个老代码改了下,应该符合楼主的要求,其实还有很多其他的办法,这个方法不用调用一些特殊函数,免得杀软报毒
unit ProcessListU;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Tlhelp32, StdCtrls, ExtCtrls, ComCtrls, Menus;type
TFrmProcessList = class(TForm)
ListView1: TListView;
Panel1: TPanel;
BtnTerminateProcess: TButton;
BtnRefresh: TButton;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure BtnTerminateProcessClick(Sender: TObject);
procedure BtnRefreshClick(Sender: TObject);
private
{ Private declarations }
procedure GetProcessList;
public
{ Public declarations }
end;var
FrmProcessList: TFrmProcessList;const
PROCESS_TERMINATE=$0001;implementation{$R *.dfm}{ TForm1 }procedure TFrmProcessList.GetProcessList;
var
NewItem: TListItem;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
ListView1.Items.Clear;
while integer(ContinueLoop) <> 0 do
begin
if LowerCase(ExtractFileName(FProcessEntry32.szExeFile))=LowerCase('demo.exe') then
begin
NewItem := ListView1.Items.Add();
NewItem.Caption := inttostr(FProcessEntry32.th32ProcessID);
NewItem.SubItems.Add(inttostr(FProcessEntry32.th32ParentProcessID));
NewItem.SubItems.Add(inttostr(FProcessEntry32.cntThreads));
NewItem.SubItems.Add(FProcessEntry32.szExeFile);
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end
else
begin
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end ;
end;
CloseHandle(FSnapshotHandle);
end;procedure TFrmProcessList.FormCreate(Sender: TObject);
begin
//TFrmProcessList.DoubleBuffered := True;
GetProcessList();
end;procedure TFrmProcessList.BtnTerminateProcessClick(Sender: TObject);
begin
if ListView1.Selected = nil then exit;
if TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),strtoint(ListView1.Selected.Caption)),0) then
begin
MessageBox(handle,'终止进程成功!','提示',64);
ListView1.Selected.Delete;
end
else
MessageBox(handle,'终止进程失败!进程拒绝访问!','错误',16);
end;procedure TFrmProcessList.BtnRefreshClick(Sender: TObject);
var
ProcessID: string;
I: integer;
begin
GetProcessList();
if ListView1.Selected = nil then exit;
ProcessID := ListView1.Selected.caption;
GetProcessList();
for I:=0 to ListView1.Items.Count-1 do
begin
if ListView1.Items[I].Caption = ProcessID then
begin
ListView1.Items[I].Selected := true;
break;
end;
end; ListView1.SetFocus;
ListView1.Refresh;
end;end.
结帖了