2010-12-07 14 views
16

SaludosWPF - Transparencia - Stream Desktop Content

Estoy en proceso de crear un marcador para un juego (Starcraft II). Este marcador se está realizando como una aplicación WPF con un código C-detrás. Ya tengo una versión que funciona en un 90% en WinForms pero carecía del soporte para que se vea mucho mejor, que está disponible en WPF.

El objetivo de esta aplicación será formar una especie de superposición sobre un juego en ejecución. Este juego está en Fulscreen (modo de ventana) así que cuando en WinForms lo codifiqué para que siempre esté en la parte superior. Lo haría y eso no fue problema.

Dado que el aspecto principal de la aplicación en WPF se basa en una imagen con un fondo transparente, he configurado la mayoría de los valores de fondo en Transparente. Sin embargo, cuando hago esto, el software de transmisión no registra la aplicación completa. Por ejemplo, simplemente muestra mi escritorio o el juego que estoy jugando, pero no mi aplicación, aunque está allí. Puedo verlo con mis propios ojos pero la audiencia en la transmisión no puede.

¿Alguien tiene alguna experiencia con este asunto porque realmente me está metiendo en la cabeza? Mi aplicación entera será inútil si no es visible en las transmisiones. Si tengo que poner el fondo en un color en lugar de transparente, la IU también se demolirá por completo en términos de apariencia.

Básicamente estoy tratando de hacer una superposición de juegos en C# & WPF. He leído que puede hacer esto de diferentes maneras, pero tengo poco o ningún conocimiento de C++ y no sé nada sobre DirectX

Gracias por su lectura de tiempo y sus posibles ideas.

Editar: La mejor solución sería una superposición similar a la de Steam/Xfire/Dolby Axon.

Edit 2: No he tenido suerte con todas las sugerencias, así que básicamente hice que los bits transparentes de mi imagen no sean transparentes y deje que el usuario decida cuál usar dependiendo del software de transmisión que usaría.

+1

Puede que tenga mejor suerte publicando en http://gamedev.stackexchange.com/ – Rachel

+0

¡Gracias, lo intentaré! – Citroenfris

+0

¿Qué software de captura está utilizando para crear la "secuencia"? FRAPS, Camtasia, etc. –

Respuesta

0

Solo una idea, pero ¿qué pasa si la hace casi transparente (es decir, alfa = 0.01 o menos)? Entonces debería tener suficiente "sustancia" para ser recogido por la transmisión, pero aún ser lo suficientemente invisible como para no perturbar la vista.

+0

El problema es el momento en que establezco AllowsTransparency = "True", no se muestra en el software de transmisión. Si lo configuro como falso, hay un borde desagradable alrededor de la imagen de la ventana que no es la idea = [. Si cambio la opacidad de la ventana, el problema es que todo en esa ventana será apenas visible. – Citroenfris

+0

Lo siento, entonces me he quedado sin ideas también. – TToni

+0

¡Gracias de todos modos! – Citroenfris

0

Una posibilidad es que la fusión alfa se realice totalmente en la GPU, evitando que el software de transmisión lo encuentre. Por lo tanto, puede tratar de forzar la representación del software en su aplicación WPF. Puede hacerlo mediante el establecimiento de:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly

+0

Me temo que esto tampoco funciona :(.Tan pronto como mi ventana cambia al tema básico (el software de transmisión lo hace automáticamente) desaparece, de lo contrario aparece en la transmisión. – Citroenfris

1

Ya que no han recibido ninguna respuesta todavía pensé que me gustaría sugerir un enfoque ligeramente diferente.

Haz un WinForm que establezcas en MDIParent. Luego, envía un comando Win32API para llevar el juego a su aplicación como una ventana secundaria, eliminar los bordes y maximizarlo.

IntPtr Parent = hWnd of your main form. 
IntPtr hWnd = Win32.User.FindWindow(null, "TheGame"); 
Win32.User.SetParent(hWnd, Parent); 
// Get current window style of child form 
int style = Win32.User.GetWindowLong(hWnd, Win32.User.GWL_STYLE); 
// Take current window style and remove WS_CAPTION and WS_BORDER from it 
Win32.User.SetWindowLong(hWnd, Win32.User.GWL_STYLE, (style & ~Win32.User.WS_CAPTION & ~Win32.User.WS_BORDER)); 
// Maximize within parent 
Win32.User.ShowWindow(hWnd, Win32.User.SW_SHOWMAXIMIZED); 

Nota: La clase Win32.User es simplemente un contenedor vainilla para los comandos de interoperabilidad Win32 correspondientes.

Ahora debería poder dibujar en la parte superior de esta ventana ya sea por GDI + 'ing directamente al hWnd o colocando algo encima.El problema que tiene con la transparencia puede requerir que realice una copia manual, es decir, renderice su interfaz en algún lugar, y luego cópiela píxel por píxel en la ventana de destino omitiendo los píxeles transparentes.

Espero que esto sea útil o al menos pueda generar algunas ideas.

EDIT: También se pueden encontrar este interesante:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

La aplicación de ejemplo le permite modificar la imagen antes de que se muestre. Simplemente agrega módulos simples que obtienen entrada y establece salida. Demasiado lento para usar en juegos reales. :)

EDIT2: Acaba de encontrar SetLayeredWindowAttributes. No estoy seguro si funciona, pero puede usar esta llamada (vea mi código arriba en la ventana de búsqueda) para establecer el color de la transparencia.

1

Tuve un problema con Transparency en WPF. Cuando establece la transparencia en cero, no tiene nada que recojer. Establezca el valor mínimo, luego el software de transmisión podrá recogerlo.

Cuestiones relacionadas