2011-08-12 7 views
5

yo uso siguiente código para capturar la pantalla con funciones GDI:¿Cómo acelerar BitBlt para capturar pantalla con aero?

// Prologue: 

int iScreenWidth = GetSystemMetrics(SM_CXSCREEN); 
int iScreenHeight = GetSystemMetrics(SM_CYSCREEN); 

HDC hScreenDC = GetDC(0); 
HDC hCaptureDC = CreateCompatibleDC(hScreenDC); 
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hScreenDC, iScreenWidth, iScreenHeight); 
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hCaptureDC, hCaptureBitmap); 

// Capture: 

BitBlt(hCaptureDC, 0, 0, iScreenWidth, iScreenHeight, hScreenDC, 0, 0, SRCCOPY); 

// --- ... --- // 

// Epilogue: 

SelectObject(hCaptureDC, hOldBitmap); 
DeleteObject(hCaptureBitmap); 
DeleteDC(hCaptureDC); 
ReleaseDC(0, hScreenDC); 

El problema es: función BitBlt es MANERA lento cuando Aero está activada - se tarda casi 50 milisegundos (lo cual es inaceptable para mí, porque Necesito capturar varias veces en segundo).

BitBlt obtiene los datos de píxeles directamente del hardware de video. Pero las tarjetas de video son bastante buenas en mis máquinas de prueba (a saber, Radeon 5470 y Radeon 4850), así que no entiendo lo que está mal. Sé que estas tarjetas (cualquier tarjeta moderna) no son tan buenas en 2D, ya que están en 3D, pero esa simple operación blit no debería tomar 50ms de todos modos, creo.

Entonces, ¿podría aconsejar qué hacer? Cualquier tipo de solución "hackish" (siempre y cuando sea estable de trabajo) haría en mi caso.

El sistema de destino es Win7 x64, código de 32 bits.

¡Gracias de antemano!

+1

En Aero, el escritorio se compone de mapas de bits de memoria individuales de todas las ventanas de nivel superior. Permite funciones como miniaturas de ventanas en vivo y Aero Peek. Esto, por supuesto, no es gratis y no será de ninguna manera acelerado por hardware para BitBlt. Deberías activar la opción CAPTUREBLT. Dudo que haga mucha diferencia. –

Respuesta

Cuestiones relacionadas