Overlay - Über DirectX, OpenGL und normale Oberfläche drüber zeichnen

Hallo,

Ich würde sehr gerne mit OpenGL oder DirectX _alles_ overlayen, d.h. über alle Anwendungen rüberzeichnen.
Dabei sollen die anderen Anwendungen nicht minimiert oder sonst wie verändert werden.
Das Overlay soll den gesamten sichtbaren Bildschirm überdecken und ein Video sein, dass - skaliert zur Bildschirmauflösung angezeigt werden soll (auf Tastendruck).
So und ich hab keine Ahnung, wie ich das gut umsetzen könnte.
Eine Idee von mir war, "einfach" die OpenGL- und DirectX-Ausgabe zu hooken, müsste dann halt wahrscheinlich noch ein Fenster auf dem Desktop anzeigen lassen, das immer im Vordergrund ist...

Hat jemand eine Idee, wie ich das unter Windows XP machen kann, ohne jede einzelne Grafikbibliothek zu hooken?

Danke, Xantoo
 
_alles_ overlayen ?

Heißt das, dass du eine Anwendung mit einem bestimmten Inhalt (Buttons, Memos, ..) mit einem Video verdecken willst ?

Falls ja, dann könntest du dir den DeviceContext per GetDC() / GetWindowDC() vom aktuellen Fenster holen und je nachdem damit rumspielen.

MfG
 
Ich will aber leider nicht nur eine Anwendung mit'm Video verstecken, sondern praktisch den ganzen Bildschirm damit überdecken.
Und zwar so, dass andere Anwendungen, auch die, die mit DirectX und OpenGL arbeiten, zwar nicht mehr sichtbar sind, aber auch nicht verändert werden (wie z.B. minimieren).
 
Wenn das so ist, dann könntest du es wie folgt implementieren:

per GetDesktopWindow() den Handle vom Desktop holen;
von dieser den Device Context ermitteln und einen
Bitmap mit dem Handle von diesem DC erstellen und drauf malen.

MfG
 
Hm, das mit dem Zeichen funktioniert schonmal, danke.

Allerdings bemerke ich in einem Spiel (z.B. Oblivion) keine Änderung des Bildes.
Außerdem muss ich es irgendwie hinbekommen, dass eine bestimmte Zeit lang nur mein Programm das Bild überschreiben kann.

(Wie) geht sowas?
 
der desktop ist ein bild was nicht refreshed wird...

oblivion und andere FPS games haben wie der name schon sagt, mehrere frames per second.

das heißt du musst auch oft genug zeichnen

mach mal eine schleife mit ner bedingung deiner wahl und dann folgendes rein:

Sleep(10);
aufSpielMalen(...);

dann wprd das 100 mal pro sekunde gezeichnet.

ansosnten würde es jetzt nur gezeichnet werden und sofort mit dem nächsten frame überdeckt werden...


probiers einfach mal


mfg
 
<klugscheiss>
FPS game bedeutet nicht, dass das Spiel mehrere FPS hat, es bedeutet First Person Shooter, also Egoshooter. FPS hat jedes Spiel :) (sogar Schach oder sowas, da nur halt wahrscheinlich unter 1 FPS)
</klugscheiss>
 
Auf diese Weise habe ich aber zum Einen ein extremes Flackern auf dem Bildschirm, und zum anderen eine ziemlich niedrige Framerate, dafür aber eine hohe CPU-Auslastung :/
Es wäre besser, wenn ich irgendwie verhindern könnte, dass da 'n anderes Programm was hinzeichnet...
 
Dazu könntest du, wie du schon am Anfang erwähnt hattest, einen Hook setzen:
OpenGl: glBegin -> hooken und im Hook nichts anstellen;
DirectX: kA ... ich lebe nur für OpenSource ...

MfG
 
Ja, an einem Direct3D-Hook arbeite ich gerade, ist aber ganz schön schwierig, vor allem, wenn man noch nie mit Direct3D gearbeitet hat.
Meine Idee wäre dann, die Bildausgabe von DirectX und OpenGL einfach "wegzulassen", sodass ich ganz bequem drüber zeichnen kann, ohne dass es jedes Mal aktualisiert wird.
Eine andere Idee von mir, die zumindest einfacher umzusetzen ist, wäre es, einfach via Suspend/ResumeThread die Bildaktualisierenden Prozesse anzuhalten und dann hinterher wieder fortzusetzen.

Welchen Weg ich auch immer gehe, ich habe zwei Probleme:
1. Ich muss irgendwie den Ton loswerden, der sonst immernoch weiterspielt
2. In manchen Spielen - zum Beispiel Oblivion - funktionieren meine "globalen" Hotkeys - warum auch immer - nicht.

Gerade für das zweite Problem brauche ich jetzt unbedingt 'ne Lösung, sonst kann ich's nicht wirklich gut testen und schon garnicht anwenden.

Wie mach ich das korrekt und warum funktionieren meine globalen Hotkeys nicht? Kann das was mit DirectInput zu tun haben?
 
Zurück
Oben