Einzelnen Beitrag anzeigen

dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#1

Mal wieder: Doppeltes starten einer Anwendung unterbinden

  Alt 11. Feb 2010, 12:34
Mahlzeit,
ich versuche ein Programm per ShellExecute in ein anderes Programm einzubinden.
Dabei darf diese Anwendung immer nur 1x gestartet werden.
Wenn man versucht die Anwendung ein 2. mal zu starten soll die 1. Instanz in den Vordergrund geholt werden.

Ich habe also im Quelltext der aufzurufenden Anwendung folgenden Code hinterlegt. Der Aufruf und das Unterbinden von Mehrfachstarts funktionieren, aber die Anwendung wird nur beim 1. Versuch in den Vordergrund geholt...

Ich vermute das "BringWindowToTop" der falsche Befehl ist, aber "ShowWindow" bringt auch nicht den Erwünschten Erfolg (Es wird nur ein kleines Blaues Fenster über der Taskleiste angezeigt). Was anderes habe ich in den anderen Threads nicht gefunden... Sieht Jemand was ich falsch mache?

Delphi-Quellcode:
{$R *.res}
  const
    MutexName = 'ErweiterteListen';
  var
    hMutex: THandle;
  NextHandle: Hwnd;
  foundedHandle : Hwnd;
  NextTitle: array[0..260] of char;
  foundHandle : Boolean;
    begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TListStatSchnittForm, ListStatSchnittForm);
    foundHandle := false;
    hMutex := CreateMutex(NIL, True, MutexName);
    if (hMutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
    begin
      //Ab hier wird die schon gestartete Anwendung gesucht
      CloseHandle(hMutex);
      begin
        NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
        while (NextHandle > 0) and (foundHandle = false) do
        begin
          GetWindowText(NextHandle, NextTitle, 255);
          if (Pos(ListStatSchnittForm.Caption, StrPas(NextTitle)) <> 0)
            and (NextHandle <> application.Handle)
            and (NextHandle <> ListStatSchnittForm.Handle) then
          begin
            foundedHandle := NextHandle;
            foundHandle := true;
          end
          else
            NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
        end;
      end;
      if foundHandle then
      begin
        BringWindowToTop(foundedHandle);
        //ShowWindow(foundedHandle, SW_SHOW);
        halt;
      end
    end;
  Application.Run;
end.
  Mit Zitat antworten Zitat