Einzelnen Beitrag anzeigen

Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Mehrfachaufrufe verhindern...

  Alt 15. Mai 2005, 20:14
Der Vorschlag mit den Semaphoren ist gut ! Häufig wird auch Mutex verwendet, aber davon halte ich nicht viel. Ich mache das so :

Delphi-Quellcode:
(*

Anforderung:

Programm darf nur einmal gestartet werden, bei mehrfachen Start, soll der
Bildschirm genau so aussehen, wie beim Verlassen des Programms. Art des
Programmstarts (Taskleiste, Kommandozeile usw.) soll egal sein.

*)

unit sema;

interface

uses
  Windows, Messages,SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

function BereitsAktiv: Boolean;

implementation

function BereitsAktiv: Boolean;
var
  semName,
  appClass: PChar;
  hSem : THandle;
  hWndMe : HWnd;
  appTitle: Array[0..MAX_PATH] of Char;
begin
  Result := false;
  GetMem(semName,15);
  GetMem(appClass,15);
  StrPCopy(semName,'sema');
  StrPCopy(appClass,'TApplication');
  StrPCopy(appTitle,ExtractFileName(Application.Title));

  // hSem enthält die Nr. der gestarteten Programminstanz

  hSem := CreateSemaphore(nil,0,1,semName);

  // bei nur einmaligem Start muß hSem = 0 sein

  if (hSem <> 0) and (GetLastError() =
                      ERROR_ALREADY_EXISTS) then
    begin
      CloseHandle(hSem);

      // handle des aktuellen Windows ermitteln
      // und Ändern des Titels, um die andere Instanz zu ermitteln
      hWndMe := FindWindow(appClass,appTitle);
      SetWindowText(hWndMe,'ZZZZZZZZ'); // vorausgesetzt kein Programm heißt so

      hWndMe := FindWindow(appClass,appTitle);
      // falls andere Instanz existiert : diese in Vordergrund bringen,
      // Programm steht dann wieder genau an der Stelle, an der es verlassen wurde

      if (hWndMe <> 0) then
        begin
          BringWindowToTop(hWndMe);
          ShowWindow(hWndMe,SW_SHOWNORMAL);
        end;
      Result := true;
    end;

  // PChars freigeben
  FreeMem(semName,15);
  FreeMem(appClass,15);
end;

end.
Hammerhart. Das ist ja mein Code. Nur mit englischen Kommentaren.
Gruß
Hansa
  Mit Zitat antworten Zitat