2010-05-29 9 views
5

Ich habe solche Dinge gesehen und ich frage mich, ob dies möglich war, sagen wir meine Anwendung laufen und es wird das Rendern auf was auch immer darunter angezeigt wird.Draw OpenGL auf dem Windows-Desktop ohne ein Fenster

Also im Grunde, Rendern auf dem Bildschirm ohne ein Fenster.

Möglich oder eine Lüge?

Hinweis: Möchten Sie dies unter Windows und in C++ tun.

+0

Ich verstehe nicht, was Sie mit der Renderausgabe tun möchten: wo möchten Sie es zeigen? Related: http://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file –

Antwort

4

Es ist möglich, Ihre Anwendung zu verwenden, um auf andere Anwendungsfenster zu zeichnen. Sobald Sie das gewünschte Fenster gefunden haben, haben Sie es HWND, Sie können es dann verwenden, als wäre es Ihr eigenes Fenster für die Zwecke des Zeichnens. Aber da dieses Fenster nicht weiß, dass Sie das getan haben, wird es wahrscheinlich alles durcheinander bringen, was Sie gezeichnet haben, wenn es versucht, sich neu zu zeichnen.

Es gibt einige sehr komplizierte Wege, um dies zu umgehen, einige von ihnen beinhalten die Verwendung von Windows "Hooks" zum Abfangen von Zeichenmeldungen in diesem Fenster, so dass Sie wissen, wann es neu gezeichnet hat, so dass Sie auch Ihre Neuzeichnung tun können.

Eine weitere Option ist die Verwendung von Clipping-Bereichen in einem Fenster. Dadurch können Sie Ihrem Fenster eine ungewöhnliche Form geben, und alles, was dahinter steht, sieht immer noch korrekt aus.

Es gibt auch Möglichkeiten, das Zeichnen des Desktophintergrundfensters zu übernehmen, und Sie können tatsächlich eine Anwendung ausführen, die Animationen und Dinge auf dem Desktophintergrund zeichnet (solange der Desktop noch verwendbar ist). Zumindest war dies bis XP möglich, nicht sicher, ob es sich in Vista/Win7 geändert hat.

Leider sind all diese Optionen zu komplex, um ohne weitere Informationen darüber, was Sie versuchen, zu vertiefen.

1

Sie können GetDesktopWindow() verwenden, um die HWND des Desktops zu erhalten. Aber wie eine frühere Antwort (SoapBox) sagt, sei vorsichtig, du kannst den Desktop durcheinander bringen, weil das Betriebssystem erwartet, dass es es besitzt.

+0

Ja, es ist schwierig, damit zu arbeiten (richtig), meine Vermutung war, dass ich könnte jeden Frame rasterisieren und dann die ganze Zeit als ein benutzerdefiniertes Fenster verwenden, aber das würde ziemlich langsam werden. Ich habe GDI vor dem Zeichnen von PNGs auf dem Desktop usw. verwendet, aber Animationen in diesem ist ein bisschen schwierig, aber ich werde versuchen, meine Rasterisierung Idee mit GDI zu tun, alles auf ein PNG rendern und dies mit GDI verwenden. Danke für die Hilfe SoapBox und gbrandt natürlich. – Yonathan

0

Ich schrieb vor ein paar Jahren ein Open-Source-Projekt, um dies auf dem Desktop-Hintergrund zu erreichen. Es heißt Uberdash. Wenn Sie der Fensterhierarchie folgen, ist der Desktop nur ein Fenster in einer Art "Hintergrund" -Container. Dann gibt es einen Hauptbehälter und einen vorderen Behälter. Der vordere Container ist, wie Windows zum Vollbild oder "immer oben" wird. Möglicherweise können Sie Aero-Komposition verwenden, um ein Fenster mit Alpha im vorderen Container zu rendern, aber Sie müssen Ereignisse an die unteren Fenster weiterleiten. Es wird nicht schön sein.

In einigen Grafikkarten gibt es auch eine Technologie namens Overlays/Underlays. Du warst in der Lage, direkt auf ein Overlay zu rendern. Ihre GPU würde es direkt anwenden, ohne den Hauptspeicher zu stören. Selbst wenn Sie eine Bildschirmaufnahme gemacht haben, wird Ihr Overlay/Underlay nicht in der Bildschirmobergrenze angezeigt. Leider verbietet MS diese Technologie in Vista ...

Verwandte Themen