как захватить рабочий стол с помощью 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);
}

Но мне нужен код, который быстро захватывает и сохраняет его как изображение.

Заранее спасибо..


person Santhosh    schedule 10.11.2010    source источник
comment
Я не знаю, почему это заняло бы слишком много времени. Как долго и какая строка кода самая медленная?   -  person Marcelo Cantos    schedule 10.11.2010
comment
Мне нужно записать действия на рабочем столе в видео. Но приведенный выше код занимает 2 или 3 секунды для захвата одного изображения. поэтому, когда я постоянно использую код для захвата изображения, система зависает. Я ищу код, который захватывает без каких-либо затрат времени. Пожалуйста, направьте меня на правильный путь.   -  person Santhosh    schedule 11.11.2010
comment
Вы пытались создать растровое изображение в начале и использовать его повторно, а не создавать его каждый раз?   -  person Moo-Juice    schedule 12.11.2010


Ответы (1)


Я протестировал ваш код с помощью функций счетчика производительности следующим образом:

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;
   // ..
}

Полученное время составило около 80 микросекунд. Я не думаю, что ваш компьютер невероятно медленный. Вероятно, проблема в другом (например, в вопросе синхронизации потоков).

person Ovidiu Cucu    schedule 29.07.2011