C# Anwendung immer im Vordergrund

Zephyro

Ensign
Registriert
Juni 2011
Beiträge
138
Hallo,

ist es möglich eine Anwendung (geschrieben in c#) immer im Vordergrund zu halten? Auch wenn ich ein Spiel starte und trotzdem möchte das meine Anwendung zu sehen ist?

Die Anwendung soll nur aus ein paar icons bestehen, die irgendwo am Bilschirmrand zu sehen ist.

Danke schonmal!
MfG Zephyro
 
Also kommt es immer darauf an, wie das Spiel geschrieben ist? Gibts keine 100% Lösung, die meine Anwendung immer im Vordergrund hält?
 
Ja, es gibt eine Möglichkeit, die immer funktioniert, jedoch ist diese nicht gerade einfach: du musst dich in die Render-Loop hooken und dort dann nachdem das Spiel alles gezeichnet hat, dein Zeugs zeichnen.
Zumindest funktioniert diese, wenn das Spiel mit DirectX zeichnet.

Wenn es kein "echtes" Vollbild ist, dann kann man höchstens probieren es über die TopMost-Eigenschaft zu machen, jedoch klappt dies nur solange, solange die Anwendung, die darunter sein soll, nicht selbst immer im Vordergrund sein will.
 
Zuletzt bearbeitet:
Scheint ja doch schwerer zu sein, als ich erst dachte...
Selbst wenn ich das mit dem Render-Loop hinbekommen sollte, dann hilft mir das aber nur bei Anwendungen weiter, die DirectX nutzen.

Meine Anwendung soll immer im Vordergrund sein, egal was für eine andere (Vollbild-)Anwendung schon läuft.

EDIT: @BigNum

Wenn meine und die andere Anwendung (also z.b. das Spiel), beide TopMost auf true haben, was dann?
 
Zuletzt bearbeitet:
Es ist nicht möglich, dass es IMMER im Vordergrund ist.
Bei DirectX (und ich glaube bei OpenGL auch) könnte man sich in die Render-Loop hooken.

Bei "nicht-echtem" Vollbild (erkennt man daran, dass man mit Alt+Tab viel schneller auf dem Desktop/Im anderem Fenster ist) sollte TopMost reichen.

Aber eine Möglichkeit für Spiele fällt mir da noch ein:
Spiele im Fenster-Modus starten, da nervt dann jedoch der Fensterrahmen:
Per FindWindow das FensterHandle des Spiels bekommen, dann mit irgendwelchen anderen Funktionen in der Windows-API "WindowStyle" auf "None" (entfernt den Rahmen) setzen und die Location auf (0|0) setzen.

Dann hat man "nicht echtes" Vollbild und kann die TopMost-Eigenschaft verwenden.
Diese Möglichkeit finde ich am einfachsten.

Es gibt nur eine einzige Möglichkeit, welche mit nativem C# aber glaube ich nicht möglich (man müsste mit DLLImport arbeiten) ist wäre:
Sich in den Screen-Buffer zu hooken und einfach seine eigenen Sachen an den Bildschirm zu senden.
 
Zephyro schrieb:
Wenn meine und die andere Anwendung (also z.b. das Spiel), beide TopMost auf true haben, was dann?
kommt das in den vordergrund, was den eingabefocus hat (in der regel das, welches als letztes angeklickt wurde)
 
Außer man setzt mit der Windows-API TopMost der anderen Anwendung auf False ;).
 
Erstmal danke für all eure Antworten! ;)

Bagbag schrieb:
Aber eine Möglichkeit für Spiele fällt mir da noch ein:
Spiele im Fenster-Modus starten, da nervt dann jedoch der Fensterrahmen:
Per FindWindow das FensterHandle des Spiels bekommen, dann mit irgendwelchen anderen Funktionen in der Windows-API "WindowStyle" auf "None" (entfernt den Rahmen) setzen und die Location auf (0|0) setzen.

Dann hat man "nicht echtes" Vollbild und kann die TopMost-Eigenschaft verwenden.
Diese Möglichkeit finde ich am einfachsten.
Bagbag schrieb:
Außer man setzt mit der Windows-API TopMost der anderen Anwendung auf False ;).

Wenn das geht, dann wäre das ziemlich genial ;)
Kann man denn immer die Eigenschaften der anderen Fenster "manipulieren"?


Gellius schrieb:

Danke für den Link... Ich werde mir das auch mal genauer anschauen
 
Ja, mann kann alle anderen Fenster so ändern, als wäre es das eigene.

Das mit SetForegroundWindow etc. funktioniert aber auch nur bei "unechtem" Vollbild.
 
Ahja, ok.
Muss ich zwingend die anderen Vollbild-Anwendungen im Fenstermodus starten oder kann ich auch dies, später über meine eigene Anwendung, per FindWindow entsprechend einstellen?
 
Da bin ich mir nun nicht sicher, aber ich glaube hier musst du es im Fenstermodus starten.

Was du höchstens machen kannst, sofern das Spiel es unterstütz, per Tastenkombination in den Fenstermodus ändern (meist Alt+Enter).
Also die Eingabe(n) simulieren.

Ich bin mir grad nicht sicher ob das mit SendInput klappt, aber man könnte die Eingabegeräte auch hooken.
Und noch etwas fällt mir ein, bin mir aber grad nicht sicher ob es das wirklich gibt bzw. geht: DirectX hat auch irgendetwas mit Eingabegeräten, mit dem man es simulieren könnte.

Edit:
Vielleicht kann man mit der DirectX-API eine Vollbild-Anwendung in den Fenstermodus versetzen, so wie man mit der Windows-API andere Fenster manipulieren kann.
 
Zuletzt bearbeitet:
Danke für die Infos!
Ich schau mal wie ich zurecht komme. Zur not kann ich eben meine Anwendung nur mit Tastenbombinationen steuern. ;)

Viele Grüße,
Zephyro
 
Nein nein, das meinte ich nicht.

Spiele, welche im Vollbild laufen, kann man meist mit Alt+Enter in den Fenstermodus umschalten.
Bei deiner Anwendung braucht man keine Tastenkombis.
 
Ich habe das schon verstanden wie du es (mit Alt+Enter) gemeint hattest. ;)
Wollte mit meinem letzten Post nur sagen, dass ich die wenigen Funktionen meiner Anwendung auch mit selbst definierten Tastenkombinationen steuern könnte, falls ich es mit der grafischen Darstellung, also den Icons am rande des Bildschirms, nicht hinbekomme.

Ich fände es allerdings schöner, wenn die grafische Lösung auch funktioniert. ;)
 
Zurück
Oben