AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Festellen ob anderes Programm Fenster erzeugt hat
Thema durchsuchen
Ansicht
Themen-Optionen

Festellen ob anderes Programm Fenster erzeugt hat

Ein Thema von Scorpion3000 · begonnen am 14. Sep 2004 · letzter Beitrag vom 15. Sep 2004
Antwort Antwort
Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#1

Festellen ob anderes Programm Fenster erzeugt hat

  Alt 14. Sep 2004, 15:07
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
  Mit Zitat antworten Zitat
Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Festellen ob anderes Programm Fenster erzeugt hat

  Alt 14. Sep 2004, 17:36
Ok! Habs auf etwas uneleganter weise gelöst!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Festellen ob anderes Programm Fenster erzeugt hat

  Alt 14. Sep 2004, 17:48
Könntest du auch sagen wie?
Das würde vielleicht anderen helfen.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Festellen ob anderes Programm Fenster erzeugt hat

  Alt 15. Sep 2004, 12:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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