Einzelnen Beitrag anzeigen

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, 11: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