Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF-Window immer über(!) der Taskbar
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

WPF-Window immer über(!) der Taskbar

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von visionmaster am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16204

beantworten | zitieren | melden

Kann das sein, dass Du den sogenannten Kiosk Modus haben willst?
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@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.
Attachments
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@Abt: Nein, es soll kein kiosk-Modus sein.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

Zitat von visionmaster
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.ä.)?
Zitat von visionmaster
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?)
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@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!
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

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!?!
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

Nein. Was sollte ich da wie anpassen?
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

Th69: Sorry - ich habs!
SetWindowPos gesetzt - und schon funktioniert alles
Nochmal vielen Dank - jetzt hab ich die Lösung.
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4188

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 189

beantworten | zitieren | melden

Die Frage betrifft zwar c++, aber gilt natürlich trotzdem: is-task-manager-a-special-kind-of-always-on-top-window-for-windows-10
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von visionmaster am .
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 463
Herkunft: Untermeitingen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@Stefan.Haegele: Ganz einfach - ich ersetze und erweitere wesentliche Funktionen der Taskbar (speziell in Hinblick auf W11).
private Nachricht | Beiträge des Benutzers
Stefan.Haegele
myCSharp.de - Member

Avatar #avatar-3068.jpg


Dabei seit:
Beiträge: 463
Herkunft: Untermeitingen

beantworten | zitieren | melden

Zitat von visionmaster
@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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Stefan.Haegele am .
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

Ich will es ja nicht verkaufen
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16204

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
visionmaster
myCSharp.de - Member



Dabei seit:
Beiträge: 49
Herkunft: Dresden

Themenstarter:

beantworten | zitieren | melden

@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...
private Nachricht | Beiträge des Benutzers