Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Festellen ob anderes Programm Fenster erzeugt hat (https://www.delphipraxis.net/29764-festellen-ob-anderes-programm-fenster-erzeugt-hat.html)

Scorpion3000 14. Sep 2004 14:07


Festellen ob anderes Programm Fenster erzeugt hat
 
Hallo Leute!

Wie kann ich feststellen, ob ein anderes Programm seine Fenster (Formulare) schon erzeugt hat, damit ich dann EnumWindows ausführen kann. Ich führe momentan EnumWindows in einer Schleife aus, so lange bis ich ein Handle für die ProcessID gefunden habe. Leider dauert das ewig lang...

Mfg Scorpion3000

Scorpion3000 14. Sep 2004 16:36

Re: Festellen ob anderes Programm Fenster erzeugt hat
 
Ok! Habs auf etwas uneleganter weise gelöst!

alcaeus 14. Sep 2004 16:48

Re: Festellen ob anderes Programm Fenster erzeugt hat
 
Könntest du auch sagen wie?
Das würde vielleicht anderen helfen.

Greetz
alcaeus

Scorpion3000 15. Sep 2004 11:33

Re: Festellen ob anderes Programm Fenster erzeugt hat
 
Oh, sorry! Also: Ich brauchte dies für einen eigenen Desktop: Klickt jetzt ein User auf ein Programm wird dann mittels Msg die ProzessID des eben gestarteten Programms per Nachricht an den "Desktop" geschickt. Dieser führt unter anderem folgende Prozedur aus:
Delphi-Quellcode:
   {Kurze Pause um das externe Programm zu laden}
   li1:= GetTickCount;
   repeat
      Application.ProcessMessages;
   until ((GetTickCount-li1) >= Longint(100));
   ready:= false;
   while not ready do begin
      EnumWindows(@EnumWindowsProc, msg.WParam);
      if not ready then begin
         {Falls das Programm immer noch nicht gestartet hat...
          nochmals Pause}
         li1:= GetTickCount;
         repeat
            Application.ProcessMessages;
         until ((GetTickCount-li1) >= Longint(100));
      end;
   end;
Somit umgeh ich praktisch das Problem, dass das externe Programm noch nicht geladen hat. Denn ohne der Pausenfunktion würde sich die Schleife zu schnell wiederholen und somit den Pc für das erstellen der neuen Formular des externen Programms blockieren.
Per EnumWindows die Fenster aufschlüsseln.
Damit Windows einen Taskbar Button für ein Fenster erstellt, muss dieses folgende Grundstrukturen aufweisen:
+ muss ein Fenster sein (IsWindow)
+ muss sichtbar sein (IsWindowVisible)
+ darf keinen Besitzer haben (GetWindow(handle, GW_Owner)
+ darf keine Eltern haben (GetParent(handle))
Hauptsächlich gilt dies für die Hauptformulare eines Prozesses. Ein Handle auf diese bekommt man per EnumWindows - Problem: es ist nicht leicht herauszufinden, ob das Handle zu einem Hauptfenster oder zu einem ChildWindow, usw. gehört. Weiters ist es bei einem unter Delphi erstellten Programm so, dass die Application das Hauptformular ist. Man sollte allerdings diese nie maximieren - führt zu unschönen effekten. Deshalb hab ich mich dafür entschieden nur Maximieren und Wiederherstellen einzubauen und dies funktioniert problemlos auch mit dem Handle der Applikation, da per
Delphi-Quellcode:
if IsIconic(PrgHandle) then begin
      ShowWindow(PrgHandle, SW_Restore);
      BringWindowToTop(PrgHandle);
   end
   else
      ShowWindow(PrgHandle, SW_MINIMIZE);
end
sozusagen das Hauptformuler (bei Delphi eben TApplication) wiederhergestellt wird. Und Wiederherstellen ist nichts anderes als das Programm in seinen Startzustand zurückversetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz