如何在delphi下运行其他进程和控制进程,以及获得进程的一些有关信息(200分)

  • 主题发起人 主题发起人 ioi2000
  • 开始时间 开始时间
I

ioi2000

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在delphi下运行其他进程和控制进程,以及获得进程的一些有关信息
例如:获得进程的内存使用情况,CPU使用时间,以及控制进程的关闭和运行
 
没有人会吗?
 
createprocess:创建一个新进程
exitproscess:终止一个进程
getprocessworkingsetsize:了解一个应用程序在运行过程中实际向它交付了多大容量的内存
terminateprocess:结束一个进程
GlobalMemoryStatus:获取内存信息
至于cpu占用情况,从注册表中可得到HKEY_DYN_DATA/PerfStats/StartStat/KERNEL/CPUUsage""
 
CreateToolhelp32Snapshot()
Process32First()
Process32Next()
CloseHandle
CreateProcess
CreateRemoteThread
DuplicateHandle
GetCurrentProcess
GetCurrentProcessId
GetExitCodeProcess
GetPriorityClass
ReadProcessMemory
SetPriorityClass
TerminateProcess
VirtualProtectEx
WriteProcessMemory
Thread32First
Thread32Next
Module32First
Module32Next
具体的用法请参考msdn或windows sdk,引用时要uses TlHelp32
 
获得进程ID或模块Handle后,如何将控制转过去呢?
 
挂起系统
SetSystemPowerState(FALSE,FALSE);
杀死进程
procedure TForm1.Button1Click(Sender: TObject);
var
H:THandle;
P:DWORD;
begin
H:=FindWindow(nil,'无标题 - 记事本');
if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
end;
end;
判断进程是否挂起
function isHung(theWindow: HWnd; timeOut: Longint): Boolean;

var
dwResult: DWord;
begin
Result := SendMessageTimeout(theWindow,
WM_NULL,
0,
0,
SMTO_ABORTIFHUNG Or SMTO_BLOCK,
timeOut,
dwResult) <> 0;

end;

列出系统进程
(注意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;

/////////////////////////////////////////////////////
uses ... TLHelp32, ...

type
TForm1 = class(TForm)
...
end;

var
Form1: TForm1;
l : Tlist; ////返回的东东在"L"这个TList中。

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

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var p : pProcessInfo;
i : integer;
ContinueLoop:BOOL;
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
begin
l := TList.Create;
l.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;
l.Add(p);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var p : pProcessInfo;
i : integer;
begin
With l do
for i := Count - 1 DownTo 0 do
begin p := items; Dispose(p); Delete(i); end;
end;

...
end.
///////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
{Places the modulenames of the running/minimized tasks into a listbox }
var
pTask : pTaskEntry; {requires Uses ToolHelp}
Task : bool;
Pstr : array [0..79] of Char;
Str : string[80];
byt_j : byte;
begin
ListBox1.Clear;
GetMem(pTask, SizeOf(TTaskEntry)); {Reserve memory for TaskEntry}
pTask^.dwSize:=SizeOf(TTaskEntry);

byt_j:=0; {Set up a counter for number of tasks}
Task:=TaskFirst(pTask); {Find first task}
While task do
begin
inc(byt_j); {count number of different tasks}
Str:=StrPas(pTask^.szModule); {Convert PStr into Pascal string}
Listbox1.Items.Add(str); {Store Pascal string into listbox}
task:=taskNext(pTask); {Check for next possible task}
end;
Label1.Caption:=IntToStr(byt_j)+ ' tasks found'; {Show counter}
end;

 
后退
顶部