AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrfachaufrufe verhindern...

Ein Thema von Eselchen · begonnen am 15. Mai 2005 · letzter Beitrag vom 15. Mai 2005
Antwort Antwort
Hansa

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz