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);
}

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