Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Fenster vor Desktop, hinter Programmen ("Desktopsymbol")
Yogu - Mi 29.04.09 20:34
Titel: Fenster vor Desktop, hinter Programmen ("Desktopsymbol")
Hallo,
ich möchte mein Fenster vor dem Desktop, aber hinter den anderen Fenstern anzeigen. Das ganze ist eine Diashow, die auf einem Zweitmonitor abläuft, sich aber wie der normale Desktop verhalten soll (abgesehen von Programmsymbolen).
Das kenne ich von
littleDaves
Desktop Widget Engine [
http://www.delphi-forum.de/topic_Desktop+Widget+Engine+v072_86878.html], deren Widgets den Modus "Desktopsymbol" erhalten können. Dabei handelt es sich zwar um mit OpenGL gerenderte Fenster, aber ich möchte das gerne mit Windows-Fenstern machen. Trotzdem könnte man den Algorithmus vielleicht übernehmen.
Danke schonmal!
Grüße,
Yogu
ffgorcky - So 03.05.09 14:04
Sprich: Du möchtest Dein Programm bei Start gerne maximieren, aber dann alle anderen davorschieben - oder?
Ich meine das geht, indem Du eben (nachdem Du Dein Programm maximiert hast) alle anderen laufenden Anwendungen nacheinander ansprichtst und sie ihnen (auch nacheinander!) den Satus "OnTop" (aber nicht "StayOnTop"!) gibst.
Yogu - So 03.05.09 19:09
Hallo,
danke für deine Antwort,
ffgorcky!
ffgorcky hat folgendes geschrieben : |
| Sprich: Du möchtest Dein Programm bei Start gerne maximieren, aber dann alle anderen davorschieben - oder? |
Ja, und außerdem möchte ich, dass mein Programm auch im Hintergrund bleibt, wenn man darauf klickt.
ffgorcky hat folgendes geschrieben : |
| Ich meine das geht, indem Du eben (nachdem Du Dein Programm maximiert hast) alle anderen laufenden Anwendungen nacheinander ansprichtst und sie ihnen (auch nacheinander!) den Satus "OnTop" (aber nicht "StayOnTop"!) gibst. |
Wie meinst du das? Ich hab mal versucht, alle Fenster der Reihenfolge nach abzuklappern und
BringWindowToTop auszuführen, aber ich weiß nicht, wie ich das erste Fenster bekommen soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Handle := GetNextWindow(GetDesktopWindow, GW_HWNDFIRST); while IsWindow(Handle) do begin Handle := GetNextWindow(Handle, GW_HWNDNEXT); BringWindowToTop(Handle); end; |
Der Parameter
GW_HWNDFIRST will irgendwie nicht so richtig, im Beispiel kommt der Fehler "Es sind keine weiteren Dateien vorhanden" (Code 18
) - ist ja auch logisch, denn
GetDesktopWindow liefert
High(Word) zurück. Dabei darf auf den übergebenen Handle-Parameter doch gar nicht geachtet werden, schließlich will ich doch das erste Fenster!
Außerdem: Wenn dann mal alle Fenster vor dem eigenen sind - das eigene kommt ja sofort wieder in den Vordergrund, sobald ich darauf klicke. Ich könnte zwar die ganze Prozedur wieder durchführen, wenn das eigene Fenster in den Vordergrund kommt, aber das würde stark flackern etc - sehr unschön :(
Grüße,
Yogu
jakobwenzel - So 03.05.09 19:26
Warum machst du dein Hauptfenster nicht einfach zu einem Kindfenster vom Desktop?
Handle und Zeug gibts mit X-Spy, und dann einfach self.parentwindow:=handle:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var wnd: HWND; begin wnd := FindWindow('Progman', 'Program Manager'); wnd := FindWindowEx(wnd, 0, 'SHELLDLL_DefView', nil); wnd := FindWindowEx(wnd, 0, 'SysListView32', 'FolderView');
if wnd <> 0 then begin parentwindow:=wnd; end; end; |
Allerdings funktioniert das dann nicht mit alternativen Shells wie SharpE (ich hab den Code aus nem uralten Programm wo ich das mal probiert hab, keine Ahnung ob das schlussendlich funktioniert hat). Rainlendar kriegt das aber irgendwie trotzdem hin, also gibt es da wahrscheinlich noch nen besseren Weg.
Yogu - So 03.05.09 20:59
Danke,
jakobwenzel, Danke! :D
das ist doch eigentlich die nächstliegenste Methode, das Fenster einfach auf den Desktop zu kleben, indem man es ihm "in die Arme legt". Ich stand wohl etwas auf dem Schlauch.
Dein Code funktioniert prima, ich musste nur noch die Position so anpassen, dass das Fenster auf meinem zweiten Bildschirm landet, und fertig. Ein einziger Nachteil ist, dass das Neuzeichnen eines Bildteils immer etwas Zeit braucht, wodurch dann ganz kurz schwarze Flecken entstehen, wenn man ein Fenster bewegt. Aber das war schon vorher so.
Also, Thema erledigt - prima :D
Grüße,
Yogu
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!