Wyłączanie programu przy wyłączeniu innego programu

0

Witam.

Może i jest to banalne pytanie, ale jestem początkującym w programowaniu delphi.
Jak program napisany w delphi może się sam zamknąć gdy nie wykryje innego procesu? Proces nosi nazwę Neuz.exe. Jest to antyhack do gry i MUSI zostać wyłączony, gry gra zostanie wyłączona.

Z góry dziękuje za pomoc.
CinuSeK.

0

A czemu go nie możesz normalnie wyłączyć tak jak gry ?

0

O to chodzi, że ten AntyHack jest przesyłany przez Patchera do innego gracza, zostaje uruchomiony. Gry gracz wyłączy grę i znowu uruchomi Patchera, patcher nie będzie mógł podmienić plików.

0

Poniższa funkcja sprawdza czy dany proces jest uruchomiony.
Do sekcji uses należy dodać muduły SysUtils oraz TlHelp32:

  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 ((AnsiUpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
        AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.szExeFile) =
        AnsiUpperCase(ExeFileName))) then
      begin
        Result := True;
      end;
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
  end;

Sprawdzaj w wątku lub Timerze. A jak funkcja zwróci False to zamknij swój program albo rób co tam chcesz.

0

@olesio: zapomniałeś o break, a z repeat niepotrzebna byłaby zmienna ContinueLoop.

żaden timer. wątek, w wątku pobierz uchwyt do szukanego procesu (np. w powyższy sposób) i użyj WaitForSingleObject(). wątek będzie wisiał, aż proces zostanie zakończony (pamiętaj o ręcznym zakończeniu tego wątku na wypadek, gdyby to Twój program miał być zamknięty przed zakończeniem procesu).

0

Dziękuję za funkcję, ale i tak nie wiem, jak ją wykorzystać ;/

0
if not ProcessExists(...) then Application.Terminate;

Chyba :).

0

mopsiok1995 wielkie dzięki. Problem rozwiązany.

0
olesio napisał(a)

Poniższa funkcja sprawdza czy dany proces jest uruchomiony.

    while Integer(ContinueLoop) <> 0 do
    begin
      if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
        AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.szExeFile) =
        AnsiUpperCase(ExeFileName))) then

O optymalizacji to w ogóle słyszałeś ? 4x zmieniasz wielkość znaków w pętli !!

0

Opi: spokojnie - słyszałem, ale oryginalna funkcja nie jest moja. Wyszukałem ją kiedyś na google, ale jakoś
w programach nie musiałem jej często stosować, dlatego nie analizowałem jej dokladnie i nie poprawiałem.

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