Hallo StuffMaster,
vielleicht könntest du das Ganze über einen Registry-Wert lösen:
Delphi-Quellcode:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Registry;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
FAppIsRunning: Boolean;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
RegPath = 'Software\MyApp\';
RegAppRunning = 'AppRunning';
var
Reg: TRegistry;
procedure TForm1.FormCreate(Sender: TObject);
begin
Reg := TRegistry.Create();
with Reg do begin
RootKey := HKEY_LOCAL_MACHINE;
OpenKey(RegPath, True);
FAppIsRunning := ValueExists(RegAppRunning);
if FAppIsRunning then begin
Application.MessageBox('Program is already running!', 'Message');
Application.Terminate();
exit;
end else begin
WriteBool(RegAppRunning, True);
end;
CloseKey();
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
with Reg do begin
if not FAppIsRunning then begin
OpenKey(RegPath, True);
DeleteValue(RegAppRunning);
CloseKey();
end;
Free();
end;
end;
Das hat aber den Nachteil, dass Admin-Rechte gebraucht werden... Oder du löst das Ganze über eine Datei. Die kann allerdings vom Nutzer leichter gelöscht werden.
Delphi-Quellcode:
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
FAppIsRunning: Boolean;
FFleHandle: Integer;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
AppFile: String;
procedure TForm1.FormCreate(Sender: TObject);
begin
AppFile := 'appdata.dat';
FAppIsRunning := FileExists(AppFile);
if FAppIsRunning then begin
Application.MessageBox('Program is already running!', 'Message');
Application.Terminate();
exit;
end else begin
FFleHandle := FileCreate(AppFile);
FileSetAttr(AppFile, faHidden);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if not FAppIsRunning then begin
FileClose(FFleHandle);
DeleteFile(AppFile);
end;
end;
Beide Varianten haben den Nachteil, dass nicht garantiert werden kann, ob die Applikation wirklich läuft oder nicht.
Außerdem hast du bei einem Programmabsturz ein kleines Problem, da könnte evtl. eine Abfrage des Dateidatums helfen...
Grüße, Marco