Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Передать команду sleep


Автор: DIMONSOFT 20.12.2004, 12:51
Как передать другому приложению команду sleep(чтобы оно уснуло на некоторое время) и вообще, возможно ли это?

Автор: NiJazz 20.12.2004, 17:15
DIMONSOFT
Используй синхронизацию (события).
CreateEvent, OpenEvent, SetEvent, ResetEvent, WaitForSingleObject

Автор: p0s0l 21.12.2004, 01:20
Можно остановить поток из чужого процесса ( SuspendThread ), а через некоторое время запустить ( ResumeThread )...

Автор:  Dimonsoft 1.1.2005, 21:47
Цитата(p0s0l @ 21.12.2004, 01:20)
Можно остановить поток из чужого процесса ( SuspendThread ),

А как с ним работать? Можеш написать пример с Explorer.exe

Автор: p0s0l 2.1.2005, 19:31
Цитата
А как с ним работать? Можеш написать пример с 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)


Автор: DIMONSOFT 3.1.2005, 15:20
Спасибо Posol но есть проблема: у меня Win98 а там нет OpenThread smile Нет ли способа на 98

Автор: Vit 4.1.2005, 02:36
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)