写远控时写的:
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;
}