![]() |
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 |
Re: Festellen ob anderes Programm Fenster erzeugt hat
Ok! Habs auf etwas uneleganter weise gelöst!
|
Re: Festellen ob anderes Programm Fenster erzeugt hat
Könntest du auch sagen wie?
Das würde vielleicht anderen helfen. Greetz alcaeus |
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:
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.
{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; 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:
sozusagen das Hauptformuler (bei Delphi eben TApplication) wiederhergestellt wird. Und Wiederherstellen ist nichts anderes als das Programm in seinen Startzustand zurückversetzen.
if IsIconic(PrgHandle) then begin
ShowWindow(PrgHandle, SW_Restore); BringWindowToTop(PrgHandle); end else ShowWindow(PrgHandle, SW_MINIMIZE); end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz