Mehrfaches Starten einer Anwendung verhindern (Splash-Screen, wiederherstellen)(Tipp drucken)



Um das Programm über die IDE zu starten, müssen Sie den den Fensternamen entfernen oder die Unit mit dem Hauptformular schließen. Ansonsten wird das Programm wieder beendet. Der Grund liegt darin, das Delphi selbst ein Fenster dieses Namens im Formular-Designer geöffnet hat.

Weiterhin kann ein Splash-Screen (FormName = frmSplash) angezeigt werden.

Um zu einem bereits laufendes Programm zu wechseln, muss es ausfindig gemacht werden und je nach aktueller Darstellung aktiviert werden.
program Project1;

uses
  Windows, // Unit einfügen 
  Forms,
  Unit1 in 'Unit1.pas' {Form12};

{$R *.RES}

var
  Mutex: THandle;

procedure CheckForPreviousInstance;
var
  PrevWnd, PrevWndIDE: HWnd;
begin
  // Der Name Project1 muss systemweit eindeutig sein
  Mutex := CreateMutex(nil, false, 'Project1');

  if WaitForSingleObject(Mutex, 10000) = WAIT_TIMEOUT then
    Halt;

  // Um zum bereits laufenden Programm zu wechseln ...
  // Klassenname des Hauptformulars, gegebenenfalls zum Testen leer lassen ''
  PrevWnd := FindWindow('TForm12', nil);

  if PrevWnd <> 0 then
    PrevWnd := GetWindow(PrevWnd, GW_OWNER);
  if PrevWnd <> 0 then
  begin
    if not IsWindowVisible(PrevWnd) then
      exit;

    if IsIconic(PrevWnd) then
      ShowWindow(PrevWnd, SW_SHOWNORMAL)
    else
      SetForegroundWindow(PrevWnd);
    Halt;
  end;
end;

begin
  Application.Initialize;
  try
    CheckForPreviousInstance;

    // Show SplashScreen anzeigen ...
    // frmSplash := TfrmSplash.Create(nil);
    // frmSplash.Show;
    // frmSplash.Update;
    // frmSplash.Refresh; 

    Application.CreateForm(TForm12, Form12);
  finally
    ReleaseMutex(Mutex);
    CloseHandle(Mutex);
  end;

  // close SplashScreen
  // frmSplash.Close;
  // frmSplash.Free;

  Application.Run;
end.