Обходим процессы системы

Нужно отсортировать выполнение процессов в системе, т.е. поочередно выполнить несколько процессов, тем самым автоматизировать некоторый "трудовой процесс"? Этот код предоставляет такую возможность. Вы создаете "кадр" существующих в системе процессов, находите в нем нужный вам процесс по его ID и обрабатываете его сообщение.

unit PIDProcessing;

interface

function PIDExists(PID:Integer):boolean;
function RunProgram(ExeProgram:String):integer;

implementation

uses TLHelp32, Windows;

function PIDExists(PID:Integer):boolean;
{возвращает true, если процесс найден}
var hSnap:Cardinal;
// Snapshot ("кадр") запущенных процессов в системе
ProcessEntry:TProcessEntry32;
// информация о процессе
Finding:LongBool;
// возвращает true,
если первый процесс скопирован в буфер,
иначе false
Found:Boolean;
// возвращает true,
если в системе есть запущенные процессы
begin
hSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);

{создаем "кадр" запущенных процессов}

if hSnap=0 then
begin
Result:=False;
Exit;
end;
Found:=False;
ProcessEntry.dwSize:=SizeOf(ProcessEntry);
Finding:=Process32First(hSnap,ProcessEntry);

{предоставляет информацию
о первом процессе в "кадре"}

While Finding do
begin
if PID=ProcessEntry.th32ProcessID then Found:=True;

{если необходимый процесс найден,
возвращаем true}

Finding:=Process32Next(hSnap,ProcessEntry);

{предоставляет информацию
о следующем процессе в "кадре"}

end;
CloseHandle(hSnap);
Result:=Found;
end;

function RunProgram(EXEProgram:String):Boolean;

{Возвращает true,
если процесс системы выполнен}

var si:TStartupInfo;

{определение свойств главного окна,
создаваемого приложения}

pi:TProcessInformation;

{информация о созданном процессе
и его главном потоке}
begin
FillMemory(@si,sizeof(si),0);
si.cb:=Sizeof(si);
Result:=False;
if EXEProgram<>'' then
if CreateProcess(nil,PChar(EXEProgram),
nil,nil,false,
NORMAL_PRIORITY_CLASS,nil,nil,si,pi) then

{создаем процесс}

begin

{до тех пор пока процесс существует в "кадре"
обрабатываем его сообщение}

While PIDExists(pi.dwProcessId)
do Application.ProcessMessages;

CloseHandle(pi.hProcess);

{закрываем процесс}

CloseHandle(pi.hThread);

{останавливаем поток,
порожденный процессом}

Result:=True;
end;
end;

end.
 
« Предыдущая статья   Следующая статья »