2010-11-10 7 views
2

J'essaye de capturer le bureau. J'ai trouvé du code qui capture le bureau, mais prend du temps.comment capturer le bureau en utilisant vC++

void CSDITESTView::OnFileTest() 
{ 
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN); 
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN); 

HWND hDesktopWnd = GetDesktopWindow()->m_hWnd; 

HDC hDesktopDC = ::GetDC(hDesktopWnd); 
HDC hCaptureDC = CreateCompatibleDC(hDesktopDC); 
HBITMAP hCaptureBitmap =CreateCompatibleBitmap(hDesktopDC,nScreenWidth, nScreenHeight); 
SelectObject(hCaptureDC,hCaptureBitmap); 
BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight, hDesktopDC,0,0,SRCCOPY|CAPTUREBLT); 
::ReleaseDC(hDesktopWnd,hDesktopDC); 
DeleteDC(hCaptureDC); 
} 

Mais j'ai besoin de code qui capture rapidement et l'enregistre comme image.

Merci à l'avance ..

+1

Je ne sais pas pourquoi cela prendrait trop de temps. Combien de temps, exactement, et quelle ligne de code est la plus lente? –

+0

Je dois enregistrer les actions du bureau dans la vidéo. Mais le code ci-dessus prend 2 ou 3 secondes pour capturer une seule image. donc quand je suis continuellement utiliser le code pour capturer l'image, le système se bloque. Je cherche un code qui capture sans prendre de temps. Veuillez me guider vers le bon chemin. – Santhosh

+0

Avez-vous essayé de créer l'image au début et de la réutiliser plutôt que de la créer à chaque fois? –

Répondre

0

Je l'ai testé votre code à l'aide des fonctions de compteur de performance, comme suit:

void CMainFrame::OnTestTest() 
{ 
    LARGE_INTEGER lFreq, lStart, lEnd; 
    ::QueryPerformanceFrequency(&lFreq); 
    ::QueryPerformanceCounter(&lStart); 

    /// BEGIN BENCHMARK /// 
    int nScreenWidth = ::GetSystemMetrics(SM_CXSCREEN); 
    int nScreenHeight = ::GetSystemMetrics(SM_CYSCREEN); 

    HWND hDesktopWnd = ::GetDesktopWindow(); 

    HDC hDesktopDC = ::GetDC(hDesktopWnd); 
    HDC hCaptureDC = ::CreateCompatibleDC(hDesktopDC); 
    HBITMAP hCaptureBitmap = ::CreateCompatibleBitmap(hDesktopDC,nScreenWidth, nScreenHeight); 
    ::SelectObject(hCaptureDC,hCaptureBitmap); 
    ::BitBlt(hCaptureDC,0,0,nScreenWidth,nScreenHeight, hDesktopDC,0,0,SRCCOPY|CAPTUREBLT); 
    ::ReleaseDC(hDesktopWnd,hDesktopDC); 
    ::DeleteDC(hCaptureDC); 
    /// END BENCHMARK /// 

    ::QueryPerformanceCounter(&lEnd); 
    double dTime = ((double)lEnd.QuadPart - lStart.QuadPart)/lFreq.QuadPart; 
    // .. 
} 

Le temps était environ entraîné 80 microsecondes. Je ne pense pas que votre ordinateur soit incroyablement lent. Probablement le problème est dans un autre côté (par exemple une question de synchronisation de thread).

Questions connexes