Announcement

Collapse
No announcement yet.

Prüfen ob ein Programm schon aktiv ist

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Prüfen ob ein Programm schon aktiv ist

    Hallo,

    wie kann ich unter Delphi (4 bzw 5) feststellen, ob ein
    Programm aktiv ist ? Es soll, wenn nicht
    aktiv gestartet werden, und wenn schon aktiv
    dann sichtbar gemacht werden.

    Vielen Dank.

  • #2
    Hallo,

    das folgende Beispiel stammt aus meinem Buch <i>Delphi Win32-Lösungen</i>. Zuerst wird nach dem Programmfenster über die Fensterzeilenbeschriftung gesucht. Wenn ein Fenster-Handle vorliegt, schicke ich eine Botschaft an das Fenster, damit sich dieses in den Vordergrund legt. Wird kein Fenster gefunden, startet das Programm auf dem normalen Weg:
    <pre>
    { ************************************************** **************
    Typ : Projektdatei
    Autor : Andreas Kosch
    Erstellt am : 24.04.98
    Compiler : Delphi 3.02
    Betriebssystem : Windows 95
    Beschreibung : Gateway
    Revisionen : 30.04.98: Vorbereitung Win95-Server (TBNA)
    ************************************************** ************** }

    program Gateway;

    uses
    Windows,
    Forms,
    GatewayFrmLogin in 'GatewayFrmLogin.pas' {FormLogin};

    {$R *.RES}

    var
    hTargetWnd : HWND;

    { Hauptformular darf bei einem Win95-Service in der TBNA nicht in der
    Taskleiste erscheinen:
    1. "Application.ShowMainForm := False" nach "Application.Initialize"
    2. "ShowWindow(Application.Handle, SW_HIDE)" vor "Application.Run"
    3. "ShowWindow(Application.Handle, SW_HIDE)" im Initialization-Block
    jeder Formular-Unit

    Aus CENTURA heraus wird bei jedem Aufruf eine neue Instanz des
    Programms gestartet. Dabei sucht jede Instanz nach dem Login-Fenster und
    erkennt so sicher das bereits laufende TBNA-Programm.
    Über dieses Fensterhandle bekommt das Login-Formular die private
    Botschaft zugestellt und zeigt sich somit an.

    Damit in der Entwicklungsumgebung nicht das Formular-Fenster in der IDE
    über die Fentertitelbeschriftung irrtümlich angesprochen wird, bekommt
    das Login-Formular seine Fenstertitelbeschriftung erst zur Laufzeit
    (Ereignisbehandlungsmethode OnCreate) }

    begin
    hTargetWnd := FindWindowEx(0, 0, nil, c_FormTitel_Ex);
    if hTargetWnd <> 0
    then PostMessage(hTargetWnd, PM_ActivateApp, 111, 111)
    else begin
    Application.Initialize;
    Application.ShowMainForm := False; // Login-Formular
    Application.Title := 'Gateway';
    Application.CreateForm(TFormLogin, FormLogin);
    ShowWindow(Application.Handle, SW_HIDE); // Application-Window
    Application.Run;
    end;
    end.
    </pre>
    Über die Konstante c_FormTitel_Ex verwenden sowohl die DPR- als auch die PAS-Daten die gleiche Zeichenkette für die Fensterbeschriftung des zu suchenden Fensters:
    <pre>
    const
    PM_ActivateApp = WM_App + 111; // Start aus Dritt-Programm heraus
    c_FormTitel_Ex = 'Gateway - Startfenster';
    </pre>
    Das zu suchende Fenster definiert zwei Botschaftsbehandlungsmethoden für die privaten Botschaften:
    <pre>
    type
    TFormLogin = class(TForm)
    ...
    { Private-Deklarationen }
    procedure PMActivateApp(var Message: TMessage); message PM_ActivateApp;
    public
    { Public-Deklarationen }
    end;
    </pre>
    In der Botschaftsbehandlungsmethode kann sich das Programm dann selbst aktivieren

    Comment

    Working...
    X