| Цитата | | А как с ним работать? Можеш написать пример с Explorer.exe | У него много потоков... Если нужно приостановить все потоки, то так:
| Код | uses TlHelp32;
function GetProcessId (ExeName : string) : DWORD; var hSnap : THandle; pe32 : TProcessEntry32;
begin Result := INVALID_HANDLE_VALUE;
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if hSnap = INVALID_HANDLE_VALUE then Exit;
ExeName := AnsiLowerCase(ExeName); pe32.dwSize := SizeOf(pe32); if Process32First (hSnap, pe32) then repeat if AnsiLowerCase(ExtractFileName(pe32.szExeFile)) = ExeName then Result := pe32.th32ProcessID; until not Process32Next (hSnap, pe32); CloseHandle (hSnap); end;
function OpenThread (dwDesiredAccess : DWORD; bInheritHandle : LONGBOOL; dwThreadId : DWORD) : THandle; stdcall; external 'kernel32.dll'; const THREAD_SUSPEND_RESUME = ($0002);
function SleepProcess (ProcessID, SleepTime : DWORD) : integer; var hSnap, hThread : THandle; te32 : TThreadEntry32; Threads : array of THandle; i : integer;
begin Result := 0;
hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if hSnap = INVALID_HANDLE_VALUE then Exit;
te32.dwSize := SizeOf(te32); if Thread32First (hSnap, te32) then repeat if te32.th32OwnerProcessID <> ProcessID then Continue; Inc(Result); hThread := OpenThread (THREAD_SUSPEND_RESUME, False, te32.th32ThreadID); SuspendThread (hThread); SetLength (Threads, Result); Threads[Result-1] := hThread; until not Thread32Next (hSnap, te32); CloseHandle (hSnap);
Sleep (SleepTime);
if Result > 0 then for i := 0 to Result-1 do begin ResumeThread (Threads[i]); CloseHandle (Threads[i]); end; end;
|
Пример: остановить Explorer.exe на 5 секунд:| Код | SleepProcess (GetProcessId('explorer.exe'), 1000*5) |
|