2011-08-12 10 views
5

나는 GDI 기능으로 화면을 캡처하는 코드를 다음 사용BitBlt의 속도를 높여 화면을 에어로로 캡처하는 방법은 무엇입니까?

// 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); 

문제는 : 비트 블리트 기능 에어로 켤 때 WAY가 둔화 - 그것은 거의 50 밀리 초 소요 (나를 위해 받아 들일 수있는 때문에 두 번째로 여러 번 캡처해야 함).

BitBlt는 비디오 하드웨어에서 직접 픽셀 데이터를 가져옵니다. 그러나 비디오 카드는 내 테스트 머신 (Radeon 5470 및 Radeon 4850)에서 상당히 잘 작동하므로 잘못된 점을 이해하지 못합니다. 나는이 카드들 (어떤 현대의 카드들도)이 2D에서 그다지 좋지 않다는 것을 알고 있지만, 간단한 블리트 조작은 어쨌든 50ms가 걸리지 않아야한다고 생각한다.

그럼 어떻게해야할까요? 어떤 종류의 "hackish"솔루션 (안정적인 작동을하는 한) 내 경우에는 그렇게 할 것입니다.

대상 시스템은 Win7 x64, 32 비트 코드입니다.

미리 감사드립니다.

+1

Aero에서 바탕 화면은 모든 최상위 창의 개별 메모리 비트 맵에서 합성됩니다. 라이브 창 축소판 및 Aero Peek와 같은 기능을 사용할 수 있습니다. 물론 이것은 무료로 제공되는 것은 아니며 하드웨어가 BitBlt를 위해 어떤 식 으로든 가속화되지는 않습니다. 정말로 CAPTUREBLT 옵션을 켜야합니다. 나는 그것이 그것이 많은 차이를 만든다는 것을 의심한다. –

답변