Приостанавливаем (ставим на паузу) процесс. Процесс остается в рабочем состоянии, но перестает выполнять любые свои действия. Окно процесса, если имеется, так же перестает реагировать на любые события.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Uses Tlhelp32; ... var procname: string; begin procname:= 'explorer.exe'; if suspendResumeProcess(procname, true) then begin ShowMessage('Проводник Windows приостановлен, нажмите ОК чтобы возобновить.'); if suspendResumeProcess(procname, false) then ShowMessage('Процесс вознобновлен.') else ShowMessage('Не удалось возобновить процесс.'); end else begin ShowMessage('Не удалось приостановить процесс.'); end; end; |
Параметры
procname - имя процесса
suspend - если true, приостановить процесс, если false - возобновить выполнение
Результат
True, если операция успешна, False - если нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
function OpenThread (dwDesiredAccess : DWORD; bInheritHandle : BOOL; dwThreadId : DWORD) : THandle; stdcall; external 'kernel32.dll'; function suspendResumeProcess(procName:string; suspend: Boolean): Boolean; var hSnap: THandle; THR32: THREADENTRY32; hOpen: THandle; Thread: TThreadEntry32; cThr: DWORD; proc: Boolean; procE: tProcessEntry32; pid: Integer; const THREAD_SUSPEND_RESUME = $0002; THREAD_ALL_ACCESS = 2032639; begin Result := FALSE; procName:= AnsiLowerCase(procName); hOpen:=CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); procE.dwSize:=SizeOf(procE); proc:= Process32First(hOpen, procE); {$B-} if proc and (AnsiLowerCase(procE.szExeFile) <> procName) then repeat proc := Process32Next(hOpen, procE); until (not proc) or (AnsiLowerCase(procE.szExeFile) = procName); {$B+} CloseHandle(hOpen); if proc then pid:= procE.th32ProcessID else Exit; if suspend then begin hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if hSnap <> INVALID_HANDLE_VALUE then begin THR32.dwSize := SizeOf(THR32); Thread32First(hSnap, THR32); repeat if THR32.th32OwnerProcessID = PID then begin hOpen := OpenThread($0002, FALSE, THR32.th32ThreadID); if hOpen <> INVALID_HANDLE_VALUE then begin Result := TRUE; SuspendThread(hOpen); CloseHandle(hOpen); end; end; until Thread32Next(hSnap, THR32) = FALSE; CloseHandle(hSnap); end; end else begin cThr := GetCurrentThreadId; hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if hSnap <> INVALID_HANDLE_VALUE then begin Thread.dwSize := SizeOf(TThreadEntry32); if Thread32First(hSnap, Thread) then repeat if (Thread.th32ThreadID <> cThr) and (Thread.th32OwnerProcessID = pid) then begin hOpen := OpenThread(THREAD_ALL_ACCESS, false, Thread.th32ThreadID); if hOpen = 0 then Exit; ResumeThread(hOpen); CloseHandle(hOpen); end; until not Thread32Next(hSnap, Thread); Result := CloseHandle(hSnap); end; end; end; |