Как сделать проверку процесса по таймеру в delphi?

Пользователь

от evalyn.barrows , в категории: Другие , год назад

Как сделать проверку процесса по таймеру в delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от judd , год назад

@evalyn.barrows 

В Delphi можно использовать компонент TTimer для выполнения проверки процесса по таймеру. Например, если нужно проверять процесс каждые 5 секунд, можно установить TTimer на 5000 миллисекунд (5 секунд).


Ниже приведен пример кода, который будет проверять наличие процесса notepad.exe каждые 5 секунд:

  1. Разместите на форме компонент TTimer (из раздела "System" палитры компонентов).
  2. Установите свойство Enabled в True.
  3. Установите свойство Interval в 5000 (задает время в миллисекундах).
  4. Добавьте обработчик события OnTimer для TTimer.
  5. В обработчике OnTimer проверьте наличие процесса notepad.exe с помощью функции Proces***ists из модуля System.SysUtils.


Код:

1
2
3
4
5
6
7
8
uses
  System.SysUtils, Winapi.Windows, Vcl.Forms;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Proces***ists('notepad.exe') then
    ShowMessage('Процесс Notepad запущен!');
end;


Функция Proces***ists использует функции EnumProcesses и OpenProcess из библиотеки WinAPI, чтобы проверить наличие процесса. Если процесс с именем notepad.exe существует, то вызывается диалоговое окно с сообщением.


Заметьте, что функция Proces***ists должна быть определена в вашем коде:

 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
function Proces***ists(const AProcessName: string): Boolean;
const
  PROCESS_QUERY_INFORMATION = $0400;
  PROCESS_VM_READ = $0010;
var
  LProcessHandle: THandle;
  LModule: HMODULE;
  LNeeded: DWORD;
  LProcess: TProcessEntry32;
  LProcessId: DWORD;
begin
  Result := False;
  LProcess.dwSize := SizeOf(LProcess);
  LProcessHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if LProcessHandle <> INVALID_HANDLE_VALUE then
  try
    if Process32First(LProcessHandle, LProcess) then
    repeat
      if (UpperCase(ExtractFileName(LProcess.szExeFile)) = UpperCase(AProcessName)) then
      begin
        LProcessId := LProcess.th32ProcessID;
        LProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, LProcessId);
        if Assigned(LProcessHandle) then
        try
          if EnumProcessModules(LProcessHandle, @LModule, SizeOf(LModule), LNeeded) then
          begin
            if SameText(AProcessName, ExtractFileName(GetModuleFileNameEx(LProcessHandle, LModule, nil, MAX_PATH))) then
            begin
              Result := True;
              Break;
            end;
          end;
        finally
          CloseHandle(LProcessHandle);
        end;
      end;
    until not Process32Next(LProcessHandle, LProcess);
  finally
    CloseHandle(LProcessHandle);
  end;
end;