C语言抓屏的代码

void CaptureScreen()
{
    
//获得屏幕宽度
    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); 
    
    BITMAPINFO    bi;
    
void *pBits=NULL;
    ZeroMemory(
&bi,sizeof(bi));
    bi.bmiHeader.biSize
=sizeof(bi.bmiHeader);
    bi.bmiHeader.biHeight
=nScreenHeight;
    bi.bmiHeader.biWidth
=nScreenWidth;
    bi.bmiHeader.biPlanes
=1;
    bi.bmiHeader.biBitCount
=24;
    bi.bmiHeader.biCompression
=BI_RGB;
    bi.bmiHeader.biSizeImage
=3*nScreenHeight*nScreenWidth;
    
//产生位图兼容设备描述表
    HDC        hBmpFileDC=CreateCompatibleDC(hDesktopDC);
    
//产生位图兼容位图
    HBITMAP    hBmpFileBitmap=CreateDIBSection(hDesktopDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0);
    
//将兼容位图选入兼设备描述表容设备描述表
    SelectObject(hBmpFileDC,hBmpFileBitmap);
    
//将捕获的位图的象素拷贝到位图设备环境
    BitBlt(hBmpFileDC,0,0,nScreenWidth,nScreenHeight,hCaptureDC,0,0,SRCCOPY);
    
//创建文件
    HANDLE    hFile=CreateFile("111.bmp",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    
//保存位图文件
    if(hFile!=INVALID_HANDLE_VALUE)
    
{
        DWORD dwRet
=0;
        BITMAPFILEHEADER bmfHeader;
        ZeroMemory(
&bmfHeader,sizeof(bmfHeader));
        bmfHeader.bfOffBits
=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
        bmfHeader.bfSize
=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
        bmfHeader.bfType
='MB';
        
//写入位图信息头
        WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);
        
//写入位图尺寸颜色表等信息
        WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL);
        
//写入位图数据块
        WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL);
        CloseHandle(hFile);
    }

    
    DeleteDC(hBmpFileDC);
    DeleteObject(hBmpFileBitmap);
    ReleaseDC(hDesktopWnd,hDesktopDC);
    DeleteDC(hCaptureDC);
    DeleteObject(hCaptureBitmap);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章