Escribe un cliente RDP que voltee los píxeles de la pantalla

Me gustaría implementar un cliente RDP en C++ que pueda obtener el valor de color de todos los píxeles de la pantalla y volcarlos en un archivo. Sé que esto es conceptualmente diferente de cómo funciona RDP pero lo necesito para mi aplicación. Estoy tratando de hacer uso de freerdp pero no estoy seguro de cómo puedo escribir de manera eficiente un cliente que simplemente descarga todos los píxeles en un archivo.

Hasta ahora mi mejor bash es hacer uso de la función gdi_GetPixel_32bpp pero, por supuesto, llamar a esta función para cada píxel a su vez está lejos de ser eficiente.

Una solución que hace uso de otra biblioteca también será muy apreciada.

Bueno, podrías intentar esto (descargo de responsabilidad sin probar el pseudo código):

 HGDI_DC memDC = gdi_CreateCompatibleDC ( hDC ); HGDI_BITMAP memBM = gdi_CreateCompatibleBitmap ( hDC, screenWidth, screenHeight ); gdi_SelectObject ( memDC, memBM ); gdi_BitBlt(memDC, 0, 0, screenWidth, screenHeight, hDC, 0, 0, GDI_SRCCOPY); 

Ahora debería tener en memBM->data el conjunto completo de datos de píxeles. memBM-> data tiene el siguiente tamaño: memBM->width * memBM->height * memBM->bytesPerPixel

Espero que esto te ayude al menos un poco.

Esto debería ser bastante fácil de hacer de una manera muy eficiente utilizando libfreerdp-gdi. FreeRDP puede convertir todo en un búfer de software que luego puede volcar en un archivo, y puede hacerlo completamente en la memoria, sin un entorno X11, si lo desea. Como se menciona Linux, una forma rápida de comenzar sería usar xfreerdp con la opción / gdi: sw para usar libfreerdp-gdi (el valor predeterminado es usar una implementación basada en X11) y luego descargar los píxeles como actualizaciones entra. Puedes engancharte en xf_sw_end_paint, al que se llama al final de una serie de actualizaciones. Tiene acceso a la región no válida y al búfer de píxeles (todo bajo la estructura rdpGdi * gdi). Los campos importantes son gdi-> primary_buffer, gdi-> dstBpp, gdi-> bytesPerPixel, gdi-> width y gdi-> height. En la mayoría de los casos obtendrá un búfer XRGB32, que es fácil de manejar. En caso de duda, eche un vistazo a gdi_init () para la inicialización del búfer interno.

Si ejecuta un servidor VNC X e inicia la pantalla completa del cliente RDP en su interior (sin administrador de ventanas, etc.), la secuencia de dibujo debe ser algo como:

  1. El cliente RDP recibe una actualización de la sesión remota
  2. El cliente RDP traduce la actualización en mensajes X11, probablemente enviados a través del transporte de memoria compartida
  3. El servidor VNC recibe solicitudes X11 y las usa para representar un bitmap

por lo tanto, la sobrecarga debe ser simplemente el protocolo X11, que es bastante torpe pero al menos debe enviarse a través de un segmento de memoria compartida.

Honestamente, probaría este enfoque de encoding cero primero y vería si el rendimiento es realmente un problema.

WebRTC puede tener algún código que puede consultar para ayudar, como el capturador de pantalla o el capturador de ventanas .

El capturador de escritorio es más complicado porque (1) difiere para capturar contenidos mínimos y (2) también captura el mouse. Como el escritorio es solo una “ventana” especial, tal como se recupera con ::GetDesktopWindow() , y su DC se puede recuperar con esa ventana o solo con GetDC(NULL) , puede usar el capturador de ventanas e ignorar los bits más complicados. Consulte la función Capturar del capturador de ventanas para obtener más detalles, así como algunos consejos útiles sobre cómo manejar Aero y otros problemas de composición / fuera de la pantalla.