Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
Delphi 8 Professional
|
Re: Mehrfachaufrufe verhindern...
15. Mai 2005, 21: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
|
|
Zitat
|