2012-05-04 26 views
7

Situación: Tengo un software que realiza el uso compartido de pantallas en Internet, donde un usuario actúa como presentador y otros usuarios actúan como espectadores/asistentes.C++ - Cómo capturar la pantalla, excepto en algunas ventanas

Además de las ventanas de presentación, el presentador también tiene un conjunto de WINDOWS NO DISPONIBLES que aparecen en la pantalla (una barra de botones para comenzar a compartir/dejar de compartir/etc., Una ventana de Skype, etc.).

El presentador puede configurar desde la configuración del software de compartición de pantalla para hacer invisibles estas WINDOWS NO COMPARTIDAS (es decir, no aparecerán en la pantalla compartida que se envía a los asistentes, pero el contenido de la ventana detrás de ellas aparecer en la captura de pantalla).

Las capturas de pantalla se envían a aproximadamente 10 fotogramas por segundo o más rápido.

Pregunta: ¿cómo puedo capturar la pantalla mediante programación, excepto estas ventanas SIN COMPARTIR WINDOWS?

Notas:

  • Debido al valor más alto fotogramas por segundo, no puedo minimizar/maximizar/set alfa para estas ventanas, porque entonces las ventanas parpadean. La aplicación está escrita en Win32 C++.
  • Usaría ventanas en capas, pero debido a la característica de composición de escritorio de Windows 7, esto no es utilizable de fábrica (y en Windows 8, ya no puede usar DwmEnableComposition para deshabilitar temporalmente la composición)
  • Podría usar el enfoque de ventana en capas para Windows XP/2000/7 etc., y un enfoque diferente para Windows 8 (si hay uno), aunque preferiría un único proceso que funciona en todos los sistemas
  • También podría intente "componer" las capturas de pantalla capturando imágenes individuales (del escritorio, las ventanas que deben capturarse) y usando su índice z para crear la imagen final, pero debido al valor requerido de marcos por segundo, este proceso sería demasiado lento
+0

Sé que la reunión de MSFT es un buen ejemplo, aunque no sé cómo se hace. – zinking

+0

Gracias, hay productos similares que hacen esto (JoinMe o GTM), también intentaré investigar esto, pero esperaba una respuesta más rápida. –

+0

La captura de pantalla normalmente captura el "área de la pantalla sobre la ventana" en lugar del contenido dibujado de la ventana. Podría intentar capturar todas las ventanas de nivel superior visibles y recompuestas. – Deanna

Respuesta

-1

Creo que limitar el contenido de captura dentro de una gran ventana será más simple. de lo contrario, deberá cortar algunas ventanas de la captura de pantalla.

+0

Gracias, pero dado que es una aplicación de pantalla compartida (una vez más, s/w como JoinMe y GoToMeeting ya lo hacen), no es fácil de usar (o empresarial) forzar al usuario a elegir una sola ventana :) –

+3

De todos modos, mi pregunta era más sobre el aspecto técnico: ¿alguien sabe qué ** instrucciones de C/C++ ** puedo usar para capturar pantallas en Windows 7 y/u 8, y ** no ** renderizar algunas de las ventanas visibles? Estoy buscando el ** equivalente de ventanas en capas ** (consulte el siguiente [enlace de MSDN] (http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/6f1e9f74-ae6e-4df1-92b8- 72e7a98bf58f) para ver un ejemplo del uso de ventanas en capas) –

1

En Windows, incluso el escritorio se considera una ventana y tiene su propio HWND. Parece, sin embargo, que no es posible copiar el "fondo de pantalla" solo.

Así que básicamente veo dos formas de hacerlo. 1. Copie todo el escritorio, p. BitBlt (GetWindowDC (GetDesktopWindow()), ...)

O

  1. Uso GetWindow y atravesar la lista de ventanas en dirección hacia atrás a partir de la Desktop-ventana cuyo HWND sólo se puede determinar con GetDesktopWindow(), así:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

esperanza que dio algo de inspiración :-) Si alguien conoce un wa y cómo copiar SÓLO el escritorio sin sus ventanas hijas, por favor avíseme.

+0

Lo he intentado hace 4 meses. Este método creará un problema para capturar algunos elementos del escritorio, como el menú de inicio y la barra de herramientas. Estos se imprimirán en negro en el DC y no se creará transparencia. – Vishnu

Cuestiones relacionadas