Laden...

WPF-Window immer über(!) der Taskbar

Erstellt von visionmaster vor 2 Jahren Letzter Beitrag vor 2 Jahren 621 Views
V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren
WPF-Window immer über(!) der Taskbar

Hallo zusammen,

hat jemand zu folgendem Problem eine Idee:
Ich habe ein WPF-Window (nicht-maximiert). Dieses positioniere ich über der Taskbar. Sobald ich jedoch die Taskbar nutze, wird diese über mein Fenster gesetzt.
Genau das möchte ich vermeiden.
Da hilft auch (z.B.) kein Topmost.
Grund ist, dass das betreffende Fenster sehr klein ist und im Normalfall genau über der Taskbar posiitoniert wird - d.h. es verschwindet einfach, wenn die Taskbar genutzt wird.
Hat da evtl. jemand eine Lösungsidee?

4.927 Beiträge seit 2008
vor 2 Jahren

Hast du eine aus-/einblendbare Taskbar in deinen Taskleisteneinstellungen eingestellt? Ich habe eine dauernd angezeigte Taskbar und dort läßt sich kein Window - auch nicht teilweise oder sogar maximiert - darüberlegen (sondern nur im Bereich der Screen.WorkingArea).

Such aber mal nach dem Begriff "AppBar" (u.a. hier im Forum) - ich hatte schon mal unter Bei zweiter Taskleiste soll FullScreen den Bereich der zweiten Taskleiste auslassen 2 Links dazu gepostet. Ich weiß aber nicht, wie diese sich bei Überlappung verhalten.

Ein andere Ansatz wäre, daß du dein Fenster als Child der Taskleiste setzt (mittels SetParent). Und zuvor mittels FindWindow das Handle der Taskbar ermitteln:


IntPtr hWindow = new WindowInteropHelper(myWindow).Handle;
IntPtr hTaskbar = FindWindow ("Shell_TrayWnd", IntPtr.Zero);
SetParent(hWindow, hTaskbar);

Dann wäre dein WPF-Fenster aber nur sichtbar, wenn auch die Taskbar eingeblendet ist.

16.792 Beiträge seit 2008
vor 2 Jahren

Kann das sein, dass Du den sogenannten Kiosk Modus haben willst?

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

@TH69:
Vielen Dank für die ausführliche Antwort.
Die Taskbar ist nicht aus-/einblendbar. Ein Window kann man aber problemlos drüberlegen - ich habe mal zwei Bilder angefügt.
Leider funktioniert sie nicht.
Eigentlich war die Idee, das Window als Child der Taskbar zu definieren, die Beste. Denn wenn die Taskbar nicht sichtbar ist, dann brauche ich das Fenster nicht unbedingt.
Aber es tuts nicht.
Habe die drei Zeilen so genutzt:
IntPtr hWindow = new WindowInteropHelper(this).Handle;
IntPtr hTaskbar = FindWindow("Shell_TrayWnd", "");
SetParent(hWindow, hTaskbar);
Eine Frage dazu: Ist es normal, dass IntPtr hWindow = new WindowInteropHelper(this).Handle; hWindow auf 0#00000000 setzt?
Die Links muss ich noch genauer ansehen.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

@Abt: Nein, es soll kein kiosk-Modus sein.

4.927 Beiträge seit 2008
vor 2 Jahren

Die Taskbar ist nicht aus-/einblendbar. Ein Window kann man aber problemlos drüberlegen - ich habe mal zwei Bilder angefügt.

So wie dein Bild "So ist es", so ist es auch bei mir - also das Fenster hinter der Taskbar. Und "So soll es sein" ist es, wenn du TopMost aktivierst, oder?
Ich habe aber mal testweise den "Task-Manager" auf "immer im Vordergrund" gesetzt - und dieser bleibt auch bei Benutzung immer über der Taskbar.
Hast du außer TopMost noch andere Einstellungen beim Window vorgenommen (also Rahmen o.ä.)?

Eine Frage dazu: Ist es normal, dass IntPtr hWindow = new WindowInteropHelper(this).Handle; hWindow auf 0#00000000 setzt?

Nein, da sollte ein Wert ungleich Null sein. Es kann aber sein, daß du dies zu früh abgefragt hast - das Window muß schon angezeigt sein, ehe man das Handle abfragen kann (in WinForms gibt es das FormShown-Ereignis dafür - für WPF evtl. das ContentRendered-Ereignis?)

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

@Th69:
Nochmal vielen Dank für Deine Mühe!
Also: "So soll es sein" zeigt, wie sich das Window darstellt, wenn ich es starte und über der Taskbar positioniere. Da funktioniert alles wie gewünscht.
"So ist es" zeigt das Window, sobald ich die Taskbar selbst benutzt habe - dann verschwindet mein Window hinter der Taskbar. Und genau das möchte ich vermeiden!
Topmost ist gesetzt, hilft aber in diesem Fall leider nichts. Andere Einstellungen, die m.E. relevant sein könnten, sind nicht gesetzt. Einen Rahmen hat das Window nicht.

hWindow hatte ich wirklich zu früh abgefragt. Ich habe den teil nach "hinten" geschoben. Jetzt kommt ein Wert und die Funktionen laufen auch sauber durch.
Allerdings ist der Effekt nun, dass das Window komplett unsichtbar wird. Das ist natürlich auch nicht hilfreich. Kann man das (nun als Kind der Taskbar) wieder sichtbar machen? Ich werde mal ein wenig experimentieren. Oder hättest Du da noch einen Vorschlag?

Viele Grüße und Dank!

4.927 Beiträge seit 2008
vor 2 Jahren

Hast du die (relative) Position denn dann an die Taskbar angepaßt (also insb. den Top-Wert)?

Edit: Ich habe noch mal ein bißchen herumexperimentiert. Sowohl eine eigene WPF-App (mit Topmost="true") als auch andere Programme (wie der Process Explorer mit "Always On Top") verhalten sich analog wie von dir beschrieben, d.h. bei Aktivierung der Taskbar verschwinden sie dahinter, nur der Task-Manager ist wirklich immer "on top". Auch anhand der Window Styles (mit einem Programm namens "GUIPropView") habe ich keine Unterschiede feststellen können: alle "Overlapped, Topmost" - der hat wahrscheinlich eine Sonderstellung in Windows!?!

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Nein. Was sollte ich da wie anpassen?

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Th69: Sorry - ich habs!
SetWindowPos gesetzt - und schon funktioniert alles😉
Nochmal vielen Dank - jetzt hab ich die Lösung.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Th69: Noch eine letzte Frage. Jetzt schiebt er mein Window aber immer gnadenlos an das linke Ende der Taskbar. Da hilft auch kein Eintrag in SetWindowsPos. Kennst Du da eine Lösung - also quasi relatives Verschieben zur Taskbar?

4.927 Beiträge seit 2008
vor 2 Jahren

Das überrascht mich jetzt. Laß mal SetWindowPos weg und setze einfach Left und Top für das Window.

PS: Ich hatte in meinem letzten Beitrag noch ein "Edit" ergänzt - als weitere Info für dich.

D
260 Beiträge seit 2015
vor 2 Jahren

Die Frage betrifft zwar c++, aber gilt natürlich trotzdem: is-task-manager-a-special-kind-of-always-on-top-window-for-windows-10

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Ohne SetWindowsPos geht es nicht (Window ist unsichtbar).
Ich nutze die Parameter: SetWindowPos(hWindow, 0, 0, 0, (int)this.Width, (int)this.Height, SWP_NOZORDER | SWP_SHOWWINDOW);
Damit geht es - aber eben immer vorn links. Ändern des x-Werts auf z.B. 200 statt 0 bringt keinen Effekt. Zusätzlich SWP_NOMOVE lässt das Window wieder unsichtbar werden.
Das ist alles schon komisch😉

@dannoe: Das ist ein interessanter Beitrag. Speziell der weiterführende Link Window z-order in Windows 10 – ADeltaX Blog
Ich hatte nicht gedacht, dass Z-Order so kompliziert ist) - ich bin noch beim lesen...

Ich werde mal einen workarround versuchen. Werde das Fenster im linken Teil einfach transparent machen.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Ich muss wohl erstmal ein wenig schlafen gehen - es funktioniert ja doch, hatte den x-Wert dummerweise als zweiten parameter eingegeben. Er ist natürlich der dritte.
Mit SetWindowPos(hWindow, 0, (int)this.Left, 0, (int)this.Width, (int)this.Height, SWP_NOZORDER | SWP_SHOWWINDOW); ist jetzt alles OK.
Noch mal sorry und vielen Dank!

463 Beiträge seit 2009
vor 2 Jahren

Dumme Frage: Aber warum muss dein Fenster **über **der Taskleiste liegen? Dies wäre für mich ein KO Kriterium wenn ich eine Evaluierung machen würde.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

@Stefan.Haegele: Ganz einfach - ich ersetze und erweitere wesentliche Funktionen der Taskbar (speziell in Hinblick auf W11).

463 Beiträge seit 2009
vor 2 Jahren

@Stefan.Haegele: Ganz einfach - ich ersetze und erweitere wesentliche Funktionen der Taskbar (speziell in Hinblick auf W11).

Ahhh - in meinen Augen gaaanz dünnes Eis - das sind die Tool welche hinterher nur Probleme machen. Das fängt bei unterschiedlichen DPI Auflösungen / SKalierungen an und hört bei System mit mehr als 2 Monitoren auf. Aber das ist nur meine Meinung zu solchen Tools.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Ich will es ja nicht verkaufen😉

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

Es wird zum unendlichen Problem:
Ich weiß ja nicht, ob schon jemand Erfahrungen mit W11 hat...
Die zuvor diskutierte Lösung funktioniert unter W10 perfekt.
Unter W11 allerdings ist das Window zu sehen, ob nicht ansprechbar. Es reagiert auf keinen Mausklick.
Gibt es da ggf. auch einen Tipp?
Ich habe schon x Versuche gemacht, aber es gelingt nicht, das Window wieder zum Leben zu erwecken.

16.792 Beiträge seit 2008
vor 2 Jahren

In Win11 ist allgemein das Window-Verhalten an manchen Stellen durch die neue Technik anders.
Musst wahrscheinlich wirklich Zeit reinstecken Zeugs auszuprobieren.

Zu manchen Dingen in Win11 wurden auch schon Bugs gemeldet, zB dass der Hibernate Event über Win32 nicht mehr gefeuert wird.

V
visionmaster Themenstarter:in
77 Beiträge seit 2009
vor 2 Jahren

@Abt: Ja - das wird sich nicht vermeiden lassen.
Auch die Win-Systemfunktionen geben zu W10 andere Rückgabewerte. So sind z.B. teils Größen falsch (doppelt oder halb so groß, wie real. Mal so, mal so).
Probieren wir eben weiter...