Delphi - Detekcja pliku exe czy został zamknięty

0

Cześć.
Powiedzmy że mam uruchomiony jakiś tam program i znam jego plik exe.
Jak można rozpoznać, że program właśnie został zamknięty?

Używałem timera a w nim

IsExeRunning('dvbtap.exe'

), ale to raczej odpada bo on sobie sprawdza co sekunde i raczej nieelegancko tak jest.

Chodzi mi o to, że jak program jakiś zostanie zamknięty to wklepie mi do mojego programu do Labela "zamknięte".

Wiem jak zamknąć aplikację wysyłając message typu WM_Close, ale nie wiem jak odebrać komunikat, że program został zamknięty (nie zamykając go z mojej aplikacji).

Szukam na google pod różnymi hasłami, ale głównie znajduję źródła jak zamknąć aplikację, ale nie jak zdetektować że została zamknięta.
Prosiłbym o wskazówki. :)

0

Zdaje mi się, że jeśli masz uchwyt do tego procesu, to możesz użyć procedury WinAPI WaitForSingleObject.

0

Przede wszystkim musisz w jakiś sposób zdobyć ID procesu. Może to być coś takiego, tylko nie wiem czy to zadziała na nowszych systemach gdy program będzie uruchomiony na prawach zwykłego usera ale to sam musisz sprawdzić (chyba że ktoś na forum będzie taki dobry i Ci napisze)

var
  hWindow: HWND;
  pID, hProcess: Dword;
begin
  hWindow:= FindWindow(nil, 'Kalkulator');
  if (hWindow > 0) then
  begin
    GetWindowThreadProcessId(hWindow, pID);
    if (pID > 0) then
    begin
      hProcess:= OpenProcess(SYNCHRONIZE, False, pID);
      if (hProcess > 0) then
      begin
        while (WaitForSingleObject(hProcess, 50) = WAIT_TIMEOUT) do
          Application.ProcessMessages;
        ShowMessage('już'); //tu to co ma sie wykona po zamknieciu
        CloseHandle(hProcess);
      end;
    end;
  end;
end;
0

Może źle się wyraziłem. Mam taki kod:

//czy proces istnieje
function processExists(exeFileName: string): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
    begin
      Result := True;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Sprawdzenie TIMEREM

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if not (processExists('notepad.exe')) then ShowMessage('Notatnik jest zamknięty');
end;

I teraz główne pytanie: jak nie dawać tego w timer'a tak, aby program sam wywalał powyższy Showmessage, że jakiś program o podanym exe został zamknięty.
Czyli taki jakby nasłuch procesów, które zamkniemy lub otworzymy w Windowsie. Timer odpada i klikanie ręczne w Button też odpada.

Coś jak robi komponent TShellNotify, który rozpoznaje jakąś zmianę w danym folderze, to tak chcę zrobić z procesem. Niestety ten komponent nie działa z procesami tylko folderami.

0

no to bierzesz ze swojego FProcessEntry32 właściwość th32ProcessID i korzystasz z kodu Kazeka, począwszy od procedury OpenProcess.

1 użytkowników online, w tym zalogowanych: 0, gości: 1