2010-05-29 23 views
5

He visto cosas como esta y me preguntaba si esto fue posible, digamos que ejecuto mi aplicación y mostrará el renderizado en lo que se encuentre debajo.Dibuje OpenGL en el escritorio de Windows sin una ventana

Básicamente, representando en la pantalla sin una ventana.

Posible o una mentira?

Nota: Desea hacer esto en Windows y en C++.

+0

No entiendo qué quieres hacer con la salida de renderizado: ¿dónde quieres mostrarla? Relacionado: http://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file –

Respuesta

4

Es posible utilizar su aplicación para dibujar en las ventanas de otras aplicaciones. Una vez que haya encontrado la ventana que desea, tiene HWND, puede usarla como si fuera su propia ventana para dibujar. Pero como esa ventana no sabe que has hecho esto, probablemente arruinará todo lo que hayas dibujado cuando intente redibujarse.

Existen algunas formas muy complicadas de evitar esto, algunas de ellas implican el uso de "ganchos" de Windows para interceptar los mensajes de dibujo a esa ventana para saber cuándo se ha vuelto a dibujar para que pueda volver a dibujar.

Otra opción es usar regiones de recorte en una ventana. Esto puede permitirle dar a su ventana una forma inusual, y tener todo detrás de ella aún parece correcto.

También hay formas de encargarse del dibujo de la ventana de fondo del escritorio, y puede ejecutar una aplicación que dibuje animaciones y cosas en el fondo del escritorio (mientras que el escritorio todavía se puede usar). Al menos, esto fue posible a través de XP, no estoy seguro de si ha cambiado en Vista/Win7.

Desafortunadamente, todas estas opciones son demasiado complejas para profundizar sin más información sobre lo que está tratando de hacer.

1

Puede usar GetDesktopWindow(), para obtener el HWND del escritorio. Pero como dice una respuesta anterior (SoapBox), tenga cuidado, puede estropear el escritorio porque el sistema operativo espera que sea el propietario.

+0

Sí, es complicado trabajar con él (correctamente), creo que fue podría rasterizar cada cuadro y luego usarlo como una ventana con forma personalizada todo el tiempo, pero eso sería bastante lento. He usado GDI antes para dibujar png's en el escritorio, etc. pero obtener animaciones en esto es un poco complicado, pero intentaré hacer mi idea de rasterización con GDI, renderizar todo a una png y usar esto con GDI. Gracias por la ayuda de SoapBox y gbrandt, por supuesto. – Yonathan

0

Escribí un proyecto de código abierto hace unos años para lograr esto en el fondo del escritorio. Se llama Uberdash. Si sigue la jerarquía de la ventana, el escritorio es solo una ventana en una especie de contenedor "de fondo". Luego hay un contenedor principal y un contenedor frontal. El contenedor frontal es como las ventanas se convierten en pantalla completa o "siempre en la parte superior". Puede usar la composición Aero para representar una ventana con alfa en el contenedor frontal, pero deberá pasar los eventos a las ventanas inferiores. No será bonito.

Además, hay una tecnología en algunas tarjetas de video llamada superposiciones/capas subyacentes. Solía ​​poder renderizar directamente en una superposición. Su GPU lo aplicará directamente, sin interferencias en la memoria principal. Entonces, incluso si tomó una captura de pantalla, su superposición/subyacente no aparecería en el límite de la pantalla. Desafortunadamente MS prohibió esa tecnología en Vista ...

Cuestiones relacionadas