tomar pantalla pant laptop impr hacer computadora como captura winapi opengl screenshot

winapi - impr - como hacer captura de pantalla en windows 7 laptop



Obtener una captura de pantalla de una ventana hija ejecutando OpenGL en ella(Windows) (4)

Posiblemente NQR, pero podrías renderizar tu escena en un mapa de bits y BLT en el espacio en blanco.

Tengo una ventana principal con niños. Necesito tomar capturas de pantalla programáticamente para recortarlas y volver a dibujarlas en mi ventana principal. La forma en que hago esto es:

HDC hDC = GetWindowDC(hWnd); HDC memDC = CreateCompatibleDC(hDC); HBITMAP memBM = CreateCompatibleBitmap(hDC, Width, Height); HBITMAP OldBM = (HBITMAP)::SelectObject(memDC, memBM ); BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY); int Bpp = GetDeviceCaps(hDC,BITSPIXEL); int size = Bpp/8 * ( Width * Height ); BYTE *lpBits = new BYTE[size]; GetBitmapBits(memBM, size, lpBits);

Pero esto no captura la sección OpenGL de las ventanas secundarias, sino que simplemente dibuja un blanco en blanco en el área donde se supone que debe representarse OGL.


OpenGL podría estar renderizando en un contexto estratificado; tratar

BitBlt(memDC, 0, 0, Width, Height , hDC, BEGINX, BEGINY, SRCCOPY | CAPTUREBLT);

en lugar.


Recuerdo haber tenido problemas similares hace unos años cuando intentaba capturar un video y obtener una región negra donde había estado el video. Lo solucioné en ese momento al reducir la configuración de aceleración del hardware en el controlador de video (en XP: haga clic con el botón derecho en el escritorio> propiedades> configuración> avanzada> solucionar problemas).

En cuanto a una solución basada en código, es posible que desee consultar las siguientes publicaciones anteriores:

Capturas de pantalla en blanco en Vista y Win7 cuando se juega

Guardar una captura de pantalla de una ventana usando C #, WPF y DWM


Supongo que estás en la plataforma de ganar.

Creo que puedes renderizar en mapa de bits incluso si no tienes el código fuente para la ventana secundaria.

  1. Primero obtenga Handle correcto en la ventana secundaria
    • la búsqueda correcta de identificador es muy complicada porque casi todo en win es una ventana (por lo que hay cientos de identificadores ...)
  2. crear mapa de bits
  3. cambie el manejador del contexto de renderizado / dispositivo de la ventana de captura de pantalla a su mapa de bits.
    • no todas las ventanas pueden hacer eso!
  4. forzar el repintado
    • minimizar / restaurar ganar o algo
  5. almacena tu nuevo mapa de bits
  6. restaura los contextos del render / dispositivo de tu ventana capturada.

Tenga cuidado con este proceso no es muy estable (OpenGL puede hacer que los conflictos cambien durante el manejo de contexto) y en algunos casos ni siquiera puede cambiar los identificadores a contextos

Más seguro es el escritorio de captura de pantalla en sí mismo.

TCanvas *scr=new TCanvas(); scr->Handle=GetDC(GetDesktopWindow()); // copy scr to your bitmap (do not forget to resize bitmap)

Advertencia: no obtenga / cree / suelte contextos o gane puntos con demasiada frecuencia porque es un poco problemático (a veces las funciones de winapi dejan de devolver los valores correctos). Mejor forma de obtener el control una vez y esperar que nadie cierre la ventana ... para que su hijo lo gane saber exactamente cuándo obtener el nuevo controlador) Esto también es cierto para la función IsWindow ().

Para obtener más información, eche un vistazo a:

  • ¿Cómo puedo acceder a la salida de una tarjeta gráfica directamente?