Нужно отсортировать выполнение процессов в системе, т.е. поочередно выполнить несколько процессов, тем самым автоматизировать некоторый "трудовой процесс"? Этот код предоставляет такую возможность. Вы создаете "кадр" существующих в системе процессов, находите в нем нужный вам процесс по его 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.
|