写远控时写的:
void GetScreen(LPTSTR path){ DWORD BmpSize,offbits; CDC hDc,hCompatibleDc; hDc.CreateDC(L"Display", NULL, NULL, NULL);//屏幕设备上下文 hCompatibleDc.CreateCompatibleDC(&hDc);//内存兼容性设备上下文 CBitmap BmpCatch; BmpCatch.CreateCompatibleBitmap(&hDc, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES));//兼容性位图 hCompatibleDc.SelectObject(BmpCatch);
hCompatibleDc.BitBlt(0, 0, hDc.GetDeviceCaps(HORZRES), hDc.GetDeviceCaps(VERTRES), &hDc, 0, 0, SRCCOPY);//获取设备信息
HANDLE hBmp = DDBtoDIB(BmpCatch, BI_RGB, &BmpSize, &offbits);
BITMAPFILEHEADER bmpfile;//文件头信息 bmpfile.bfType = ((WORD)('M'<<8|'B')); bmpfile.bfSize = BmpSize; bmpfile.bfReserved1 = 0; bmpfile.bfReserved2 = 0; bmpfile.bfOffBits = offbits + sizeof(BITMAPFILEHEADER); HANDLE hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); DWORD dwWrite;
//全部写入 WriteFile(hFile, &bmpfile, sizeof(BITMAPFILEHEADER), &dwWrite, NULL); WriteFile(hFile, hBmp, bmpfile.bfSize, &dwWrite, NULL);
DeleteDC(hDc); GlobalFree(hBmp); CloseHandle(hFile);}
HANDLE DDBtoDIB(CBitmap& BmpCatch, DWORD dwCompression, DWORD* bmpsize, DWORD* offbits)//设备依赖转设备无依赖{ BITMAP bmp; BITMAPINFOHEADER bmphead;//信息头 LPBITMAPINFOHEADER lpbmphead; DWORD len; HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE); HDC hDC; HANDLE hDIB;
BmpCatch.GetObject(sizeof(bmp), &bmp);
bmphead.biSize = sizeof(BITMAPINFOHEADER); bmphead.biWidth = bmp.bmWidth; bmphead.biHeight = bmp.bmHeight; bmphead.biPlanes = 1; bmphead.biBitCount = bmp.bmBitsPixel; bmphead.biCompression = dwCompression; bmphead.biSizeImage = 0; bmphead.biXPelsPerMeter = 0; bmphead.biYPelsPerMeter = 0; bmphead.biClrUsed = 0; bmphead.biClrImportant = 0;
int nColors = ( 1 << bmphead.biBitCount ); if ( bmphead.biBitCount > 8 )nColors = 0; len = bmphead.biSize + nColors * sizeof(RGBQUAD);//bmp信息头大小+调色板大小
hDC = GetDC(NULL); hPal = SelectPalette(hDC,hPal,FALSE); RealizePalette(hDC);
hDIB = GlobalAlloc(GMEM_FIXED,len);
if ( !hDIB ) { SelectPalette(hDC,hPal,FALSE); ReleaseDC(NULL,hDC); return NULL; }
lpbmphead = (LPBITMAPINFOHEADER)hDIB;
*lpbmphead = bmphead;
GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight, NULL, (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//获取bmp实质内容大小
bmphead = *lpbmphead;
if ( !bmphead.biSizeImage )//未成功自己计算 { bmphead.biSizeImage = ((((bmphead.biWidth * bmphead.biBitCount) + 31) & ~31) >> 3 ) * bmphead.biHeight; } len += bmphead.biSizeImage;//大小增加
if ( !(hDIB = GlobalReAlloc(hDIB, len, GMEM_MOVEABLE)) ) { GlobalFree(hDIB); SelectPalette(hDC,hPal,FALSE); ReleaseDC(NULL,hDC); return NULL; }
lpbmphead = (LPBITMAPINFOHEADER)hDIB;
int nScan = GetDIBits(hDC, (HBITMAP)BmpCatch.GetSafeHandle(), 0, bmp.bmHeight,(LPSTR)lpbmphead + bmphead.biSize + nColors * sizeof(RGBQUAD), (LPBITMAPINFO)lpbmphead, DIB_RGB_COLORS);//实现DDB转换入内存缓冲区(与设备脱离依赖) if ( !nScan ) { GlobalFree(hDIB); SelectPalette(hDC,hPal,FALSE); ReleaseDC(NULL,hDC); return NULL; } *bmpsize = len; *offbits = bmphead.biSize + nColors * sizeof(RGBQUAD); SelectPalette(hDC,hPal,FALSE); ReleaseDC(NULL,hDC); return hDIB; }