c# wpf streaming transparency

c# - WPF-Transparencia-Transmitir contenido de escritorio



streaming transparency (4)

Como aún no ha recibido ninguna respuesta, pensé que sugeriría un enfoque ligeramente diferente.

Haga un WinForm que establezca 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 solo una envoltura de vainilla para los comandos de interoperabilidad de Win32 correspondientes.

Ahora debería poder dibujar en la parte superior de esta ventana mediante GDI + ''directamente en el hWnd o poniendo algo encima de ella. Es posible que el problema que tenga con la transparencia requiera 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 provocar algunas ideas.

EDITAR: También puede encontrar esto interesante:
http://blog.tedd.no/index.php/2010/08/16/c-image-analysis-auto-gaming-with-source/

La aplicación de muestra le permite modificar la imagen antes de que se muestre. Simplemente añádele módulos simples que reciban entrada y establezcan salida. Aunque es demasiado lento para usar en juegos reales. :)

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

Saludos

Estoy en el proceso de hacer 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 para el 90% en WinForms, pero me faltó el soporte para que se vea mucho mejor que están disponibles 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 lo hice 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 establecido la mayoría de los valores de Fondo en Transparente. Sin embargo, cuando hago esto, la aplicación completa no se registra con el software de transmisión. Por ejemplo, solo muestra mi escritorio o el juego que estoy jugando, pero no mi aplicación aunque esté ahí. Puedo verlo con mis propios ojos, pero la audiencia en la corriente no puede.

Alguien tiene alguna experiencia con este asunto porque realmente me está molestando. Mi aplicación completa será inútil si no es visible en las transmisiones. Si tengo que poner el fondo en un color en lugar de transparente, la interfaz de usuario será completamente demolida también en términos de apariencia.

Básicamente estoy tratando de hacer un juego superpuesto en C # y WPF. He leído que también puede hacer esto de diferentes maneras, pero tengo poco o ningún conocimiento de C ++, y tampoco sé nada acerca de DirectX

Gracias por su tiempo de lectura y sus posibles ideas.

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

Edición 2: no he tenido suerte con todas las sugerencias, así que básicamente hice que las partes transparentes de mi imagen no fueran transparentes y dejé que el usuario decidiera cuál utilizar, dependiendo del software de transmisión que usarían.


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


Tuve algún problema con la transparencia en WPF. Cuando establece la transparencia en cero, no tiene nada que recoger. Establecido en el valor mínimo, entonces el software de transmisión podrá recogerlo.


Una posibilidad es que la mezcla alfa se haga totalmente en la GPU, lo que evita que el software de transmisión lo encuentre. Por lo tanto, puede intentar forzar la representación del software en su aplicación WPF. Puedes hacerlo configurando:

RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly