2010-11-10 71 views
2

我正在尝试捕获桌面。我发现了一些捕获桌面的代码,但需要一些时间。如何使用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); 
} 

但我需要快速捕获并保存为图像的代码。

在此先感谢..

+1

我不知道为什么这将花费太长时间。确切地说,以及哪一行代码最慢? – 2010-11-10 12:17:05

+0

我需要将桌面操作记录到视频中。但上面的代码需要2或3秒才能捕获单个图像。所以当我不断使用代码捕捉图像时,系统会挂起。我正在寻找一个代码,无需任何时间捕获。请引导我到正确的道路。 – Santhosh 2010-11-11 05:09:29

+0

您是否尝试过在开始时创建位图并重新使用它而不是每次都创建它? – 2010-11-12 10:30:10

回答

0

我使用性能计数器功能测试你的代码,如下所示:

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 微秒。 我不认为你的电脑太慢了。问题可能在另一方面(例如线程同步的问题)。