Announcement

Collapse
No announcement yet.

Testen, ob EXE schon gestartet ist

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

  • Testen, ob EXE schon gestartet ist

    Hallo,

    ich suche einen API Befehl der prüft, ob ein Programm schon gestartet worden ist. Wenn ja sollte dieses Programm dann den Fokus erhalten.

    Danke Jörg

  • #2
    Hallo,

    das folgende Beispiel demonstriert einen Lösungsansatz: <br>
    1. Über <b>FindWindowEx</b> wird nachgeschaut, ob es bereits ein Fenster mit der angegebenen Titelzeilenbeschriftung gibt. <br>
    2. Wenn ja, wird an diese Anwendung eine private Botschaft verschickt. Trifft diese Botschaft dort ein, zeigt sich das Programm als Vollbild an. Das eigene Programm wird beendet.<br>
    3. Wurde keine Anwendung gefunden, startet das eigene Programm normal.

    <pre>
    begin
    hTargetWnd := FindWindowEx(0, 0, nil, 'Fenstertitel');
    if hTargetWnd <> 0
    then PostMessage(hTargetWnd, PM_ActivateApp, 111, 111)
    else begin
    Application.Initialize;
    Application.CreateForm(TFormLogin, FormLogin);
    Application.Run;
    end;
    end.
    </pre&gt

    Comment


    • #3
      <pre>
      Hi,

      wenn ich das untenstehende probiere,um ein anderes bereits laufendes
      Programm (hier als Beispiel: NotePad.Exe) zum aktiven Fenster
      zu machen, passiert nichts !?
      Was könnte da noch fehlen/falsch sein?
      BTW.: Es funktioniert auch nicht, wenn ich den Fenstertitel statt des
      Klassennames suche und damit dessen Handle benutze.

      ----
      var
      Form1: TForm1;
      EHandle:HWnd;

      implementation
      {$R *.DFM}

      procedure TForm1.Button1Click(Sender: TObject);
      begin
      EHandle := FindWindowEx(0,0,'Notepad',nil);
      if EHandle <> 0 then Label1.Caption := 'Notepad läuft'
      end;

      procedure TForm1.Button2Click(Sender: TObject);
      begin
      if EHandle <> 0
      then begin
      PostMessage(EHandle,WM_ActivateApp,111,111);
      end;
      end;

      Gruß
      Max

      </pre&gt

      Comment


      • #4
        Hallo,

        in meinem Beispiel vom 10.01. habe ich eine private Botschaft verwendet, die im Empfänger-Programm extra ausgewertet wird. Die von Ihnen genutzte Win32-Botschaft <b>WM_ACTIVATEAPP</b> dient nur zur Information, das normalerweise zu einer Anwendung gewechselt wird - der Wechsel wird jedoch niemals allein durch diese Botschaft ausgelöst.

        Statt dessen kann die Aufgabe mit der Win32-API-Funktion <b>SetWindowPos</b> gelöst werden, wie das folgende, modifizierte Beispiel zeigt:
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        var
        EHandle : HWnd;
        begin
        EHandle := FindWindowEx(0,0,'Notepad',nil);
        if EHandle <> 0 then
        SetWindowPos(EHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
        end;
        </pre>
        Der Wert <b>HWND_TOP</b> für den Parameter <i>hWndInsertAfter</i> legt fest, das sich das Ziel-Fenster an die Spitze aller Top-Level-Fenster setzten soll. Der letzte Parameter <b>SWP_NOSIZE</b> legt fest, das alle Positions- und Grössenangaben ignoriert werden, daher dürfen 4 Nullen übergeben werden

        Comment


        • #5
          <pre>
          Vielen Dank, hat funktioniert.
          Damit das Fenster an der alten Position erscheint habe ich noch
          SWP_NOMOVE hinzugefügt. Minimierte Fenster werden zwar aktiv,
          bleiben aber in der Taskleiste, daher noch ShowWindow hinterher.
          ..
          if EHandle <> 0 then
          SetWindowPos(EHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE
          or SWP_NOMOVE);
          // Falls es minimiert war, aufmachen durch
          ShowWindow(EHandle,SW_SHOWNORMAL);
          ..
          </pre&gt

          Comment

          Working...
          X