松鼠的博客

导航

GDI截屏

思路:
(1)获取屏幕绘图设备
(2)创建一个与屏幕绘图设备相兼容的内存绘图设备
(2)在内存中创建一个与屏幕绘图设备相兼容的图像对象
(3)将屏幕设备中的图像复制到内存绘图设备中
(4)将内存图像保存到文件中

相关函数:
GetDIBits:按位的方式返回指定的BITMAP,并按指定的格式存储到内存中

代码:

int GetBitmapFromScreen(char *lpFileName)
{
    
char *lpBuf;
    HBITMAP hBitmap;
    HBITMAP hOld ;
    HDC hDC;
    HDC hcDC;
    BITMAP bb;
    BITMAPINFO b;
    HANDLE hp;
    HANDLE fh 
= NULL;
    DWORD dwX;
    DWORD dwY;
    
    dwX 
= GetSystemMetrics(SM_CXSCREEN);
    dwY 
= GetSystemMetrics(SM_CYSCREEN);
    hDC 
= GetDC(NULL);
    hcDC    
= CreateCompatibleDC(hDC);
    hBitmap 
= CreateCompatibleBitmap(hDC,dwX,dwY);
    hOld    
= (HBITMAP)SelectObject(hcDC,hBitmap);
    BitBlt(hcDC,
00,dwX,dwY, hDC, 00, SRCCOPY); 
    bb.bmWidth        
= dwX;
    bb.bmHeight        
= dwY;
    bb.bmPlanes        
= 1;
    bb.bmWidthBytes    
= bb.bmWidth*3;
    bb.bmBitsPixel    
= 3;
    bb.bmType        
= 0;
    b.bmiHeader.biSize        
= sizeof(BITMAPINFOHEADER);
    b.bmiHeader.biWidth        
= dwX;
    b.bmiHeader.biHeight    
= dwY;
    b.bmiHeader.biPlanes    
= 1;
    b.bmiHeader.biBitCount    
= 3*8;
    b.bmiHeader.biCompression    
= BI_RGB;
    b.bmiHeader.biSizeImage        
= 0;
    b.bmiHeader.biXPelsPerMeter    
= 0;
    b.bmiHeader.biYPelsPerMeter    
= 0;
    b.bmiHeader.biClrUsed        
= 0;
    b.bmiHeader.biClrImportant    
= 0;
    b.bmiColors[
0].rgbBlue        = 8;
    b.bmiColors[
0].rgbGreen        = 8;
    b.bmiColors[
0].rgbRed        = 8;
    b.bmiColors[
0].rgbReserved    = 0;
    hp        
= GetProcessHeap();
    lpBuf    
= (char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);

    GetDIBits(hcDC,hBitmap,
0,dwY,lpBuf,&b,DIB_RGB_COLORS);
    SaveBitmapToFile(
&bb,lpFileName,lpBuf);
    ReleaseDC(NULL,hDC);
    DeleteDC(hcDC); 
    DeleteObject(hBitmap);
    DeleteObject(hOld);
    HeapFree(hp,
0,lpBuf);
    
return true;
}


相关参考:
GetDIBits
http://www.cnblogs.com/piccolo/articles/241933.html

posted on 2008-12-08 10:55  Xproer-松鼠  阅读(814)  评论(0)    收藏  举报