Autor Beitrag
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 16.12.09 09:08 
Hallo,

ich habe ein Programm geschrieben, welches eine Art Programmverwaltung darstellen soll. Es besteht aus mehreren veränderbaren Panels, die jeweils eine fremde oder eine selbst geschriebene Anwendung in das Panel einbinden soll. Dazu starte ich jede der Anwendungen mit CreateProcess, ermittle mit GetWindowThreadProcessID den Prozess und enumeriere dann mit EnumThreadWindows alle sichtbaren Formulare (IsWindowEnabled=True, IsWindowVisible=True, GetWindowRect>0 pixel, GetWindowText<>'') zu der jeweils gestarteten Anwendung.
Dann setze ich über SetParent das sichtbare Fenster der jeweiligen Anwendung in das Panel meiner Hauptanwendung hinein. Damit die eingebundene Anwendung vom Benutzer nicht wild im Panel hin- und herbewegt werden kann, setze ich den Fensterrahmen der eingebundenen Anwendung mit SetWindowLong durch löschen des SIZEBOX-Flags auf "keine Titelleiste". Somit sehen die eingebundenen Anwendungen aus, als wären sie Teil meiner eigenen Anwendung (keine Sorge: Ich will das auch nicht verschleiern, die Anwendungen sollen in keiner Weise manipuliert werden).

Das ganze funktioniert soweit alles ganz sauber, und ich habe schon viele Anwendungen getestet. Die in die Panels eingebundenen Anwendungen laufen wunderbar weiter, sogar Maus- und Tastaturaktivitäten werden i.d.R. gut verarbeitet.
Beende ich meine Anwendung, dann sollen alle eingebundenen Anwendungen ebenfalls beendet werden; das erreiche ich durch Senden eines WM_CLOSE an das Fensterhandle der Anwendung(en). Vorher werden die Anwendungen aber noch von dem Panel wieder entbunden (also zurück ans Desktop gehängt). Auch das funktioniert soweit sehr gut.

Es fehlen noch ein paar Dinge zum Glück, und hoffe, ihr könnt ein wenig Licht ins Dunkel bringen.

Zunächst habe ich das Problem, dass jede der eingebundenen Anwendungen weiterhin in der Taskleiste ein Icon aufweist. Das stört mich.

Ich habe aber bislang keine Möglichkeit gefunden, über einen API-Aufruf dieses Icon auszublenden, solange die Anwendung eingebunden ist. Geht das überhaupt? Leider habe ich hier im Forum zu diesem Thema nichts gefunden, was geeignet scheint.

_________________
Es gibt keine Probleme - nur Lösungen!
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Di 22.12.09 18:55 
erstes ergebnis bei google:
www.delphi-fundgrube.de/faq01.htm

Zitat:

Um den Taskbar-Eintrag des Programms zu verstecken, muß man das Applikationsfenster (nicht die MainForm!) unsichtbar machen:


Das ist zwar nicht ganz das, aber darauf könnte man vielleicht aufbauen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 22.12.09 20:09 
Das ist aber auch unterschiedlich. Bei Delphi-Programmen gibt es noch ein verstecktes Application-Fenster, das dann in der Taskleiste liegt. Aber auch nur bis Delphi 2006, ab Delphi 2007 wurde das Design wegen Vista korrigiert, da werden die Fenster selbst in der Taskleiste angezeigt.

Um ein sichtbares Fenster, das in der Taskleiste angezeigt wird, dort auszublenden, muss man mittels SetWindowLong WS_EX_APPWINDOW als erweiterten Style entfernen.
Logikmensch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Mi 23.12.09 10:11 
Danke Ihr Beiden. Das ist wirklich interessant. Es stimmt, wenn ich bei meinem Delphi6 Prof. eine Anwendung compiliere, dann hat die ein unsichtbares Fenster der Klasse TApplication (Breite und Höhe =0), während es noch ein weiteres Fenster gibt, welches das Hauptformular darstellt. Jetzt kapiere ich auch endlich den Unterschied von Application-Events und Form-Events. Gut zu wissen, dass es ab Delphi7 anders gelöst ist, ich finde dieses Konzept nämlich sehr verwirrend (aber nur, wenn man es nicht weiß).

Der Tipp mit dem Flag über SetWindowLong werde ich sofort ausprobieren. Erst mal vielen Dank, ich habe lange gesucht und das bisher nicht gefunden. Wie schön, dass es solch ein Forum gibt!!

Liebe Grüße!!!

_________________
Es gibt keine Probleme - nur Lösungen!