Einzelnen Beitrag anzeigen

Marphy

Registriert seit: 24. Feb 2005
162 Beiträge
 
Delphi 7 Professional
 
#6

Re: PostMessage systemweit senden?

  Alt 16. Jun 2005, 13:39
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
Marco
Wo ein Wille ist, ist auch ein Weg. Aber wo ein Weg ist, ist nicht unbedingt auch ein Wille...
  Mit Zitat antworten Zitat