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 user profile iconlittleDaves 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, user profile iconffgorcky!

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
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, user profile iconjakobwenzel, 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