Announcement

Collapse
No announcement yet.

Programm in den Vordergrund holen

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

  • Programm in den Vordergrund holen

    Wie ein weiterer Programmstart eines Programmes verhindert wird, weiß ich.
    Aber wie kann ich dabei das Erste nach erfolgreichen Abbruch des Zweiten
    in den Vordergrund holen?

    Bodo

  • #2
    Zwei Fragen:<br>
    - wie informierst Du die erste Instanz über den Abbruch der zweiten Instanz (im Falle, daß erstere sich selbst in den Vordergrund bringen soll)?<br>
    - woher bekommt die zweiten Instanz das Fenster-Handle (im Falle, daß die zweite Instanz erstere in den Vordergrund holen soll)?

    - nic

    Comment


    • #3
      Hallo Nico,

      ich stelle mal einen Auszug aus meinen Quellcode (*.dpr) dar, das beantwortet
      bestimmt Deine zwei Fragen.

      <PRE>
      ...

      var
      MutexHandle : THandle;
      hwind : HWND;

      {$R *.RES}

      begin
      MutexHandle := CreateMutex(nil, true, 'Menue');
      if MutexHandle <> 0 then begin
      if GetLastError = ERROR_ALREADY_EXISTS then begin
      CloseHandle(MutexHandle);
      hwind := 0; i := 0;
      repeat
      hwind := Windows.FindWindowEx(0, hwind, 'TApplication', 'Menue');
      until (hwind = Application.Handle);
      if hwind <> 0 then begin
      // hier der Versuch es in den Vordergrund zu holen
      Windows.ShowWindow(hwind, SW_SHOWNORMAL);
      Windows.SetForegroundWindow(hwind);
      end;
      halt;
      end;
      end;

      ...
      </PRE>

      Gruss Bod

      Comment


      • #4
        <pre>

        hwind := 0; i := 0;
        repeat
        hwind := Windows.FindWindowEx(0, hwind, 'TApplication', 'Menue');
        until (hwind = Application.Handle);

        </pre>

        Diesen Source verstehe ich nicht, bzw. er ist falsch. Du suchst solange mit FindWindowEx() bis diese Funktion das fensterhandle des AKTUELLEN Prozesses zurückliefert.<br>
        <li>1. falls FindWindowEx() NIEMALS dieses Fenster findet, haste eine Endloss-Schleife gecodet.
        <li>2. Warum FindWindowEx() nutzen wenn in Application.Handle schon das zu suchende Fenster gespeichert ist !!??
        <li>3. FindWindowEx() durchsucht die Childwindows falls ParentWnd angegeben wurde. ABER "Tapplication" ist NIEMALS ein Childfenster, immer ein Toplevel Fenster. Somit ist FindWindowEx() identisch wie FindWindow(). Bzw. es ist sinnloss mit FindWindowEx() TApplication als Childfenster zu suchen.<br>

        http://www.entwickler-forum.de\webx?128@@.ee8c498

        Gruß Hage

        Comment


        • #5
          Hallo Hagen,

          ich bin in diesen Sachen noch ein Laie, jedenfalls ist es nie zu einem Problem gekommen bezüglich Endloss-Schleifen. Den Sourcecode hatte ich von Alexander Adam aus dem PC Magazin 12/1999.

          Gruss Bod

          Comment


          • #6
            Tja das zeigt uns das auch in guten Zeitschrifften manchmal Schwachsinn steht )
            Im obigen Code kann man die Schleife durch hWind := FindWindow('TApplication', 'Menue'); ersetzen. Da dieser Aufruf das TApplication Fenster des eigenen Processes findet kann man gleich schreiben: hWind := Application.Handle. Man benötigt aber NICHT das Handle aus'm eigenen Process sondern das TApplication.Handle eines eventuell schon laufenden Processes. Man will ja erreichen das man aus dem vorher gestarteten Process das Application.Handle findet um es in den Vordergrund zu holen.<br>
            Am besten du liest mal die Messages aus dem Link den ich gepostet habe. Dort findest Du eigentlich alle wesentlichen Methoden die funktionieren.<br>

            Gruß Hage

            Comment


            • #7
              Hallo Hagen,

              habe von dem Link Deinen Eintrag vom 24. Sep. 2002 in mein Programm eingearbeitet und es funktioniert tadellos.

              Dank

              Comment


              • #8
                Gut dann haste ja auch den kleinen Fehler gefunden. CheckExists muss geändert werden in AtomExists.

                Gruß Hage

                Comment


                • #9
                  Binde doch einfach die Unit sndkey32.pas von der Delphi CD mit ein, denn dann hast du die Prozedur appactivate in der du einfach das Handle übergibst

                  Comment

                  Working...
                  X