33,311
社区成员
发帖
与我相关
我的任务
分享
void ScreenCapture(int bitCount,bool isDrawCursor)
{
int color_num = bitCount <= 8 ? 1 << bitCount : 0;
int nBISize = sizeof(BITMAPINFOHEADER) + (color_num * sizeof(RGBQUAD));
BITMAPINFO *lpbmi = (BITMAPINFO *) new BYTE[nBISize];
int nWidth=GetSystemMetrics(SM_CXSCREEN);
int nHeight=GetSystemMetrics(SM_CYSCREEN);
BITMAPINFOHEADER *lpbmih = &(lpbmi->bmiHeader);
lpbmih->biSize = sizeof(BITMAPINFOHEADER);
lpbmih->biWidth = nWidth;
lpbmih->biHeight = nHeight;
lpbmih->biPlanes = 1;
lpbmih->biBitCount = bitCount;
lpbmih->biCompression = BI_RGB;
lpbmih->biXPelsPerMeter = 0;
lpbmih->biYPelsPerMeter = 0;
lpbmih->biClrUsed = 0;
lpbmih->biClrImportant = 0;
lpbmih->biSizeImage = (((lpbmih->biWidth * lpbmih->biBitCount + 31) & ~31) >> 3) * lpbmih->biHeight;
HDC hDC = GetDC(NULL);
HDC hMemDC=CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hMemDC, 1, 1); // 高宽不能为0
GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpbmi, DIB_RGB_COLORS);
LPBYTE m_lpvFullBits=NULL;
HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE ); //得到系统默认调色板
hPal = SelectPalette(hMemDC,hPal,FALSE);
HBITMAP lpbitmap=CreateDIBSection(hMemDC, lpbmi, DIB_RGB_COLORS, (void**)&m_lpvFullBits, NULL, NULL);
HGDIOBJ hOldObject=SelectObject(hMemDC,(HGDIOBJ)lpbitmap);
BitBlt(hMemDC,0,0,nWidth,nHeight,hDC,0,0,SRCCOPY);
if(isDrawCursor)
{
POINT pt;
ICONINFO iconinfo;
GetCursorPos(&pt);
HCURSOR hIcon=GetCursor();
if(GetIconInfo(hIcon,&iconinfo))
{
pt.x-=iconinfo.xHotspot;
pt.y-=iconinfo.yHotspot;
if(iconinfo.hbmColor!=NULL)
DeleteObject(iconinfo.hbmColor);
if(iconinfo.hbmMask!=NULL)
DeleteObject(iconinfo.hbmMask);
}
DrawIconEx(hMemDC,pt.x,pt.y,hIcon,0,0,0,NULL,DI_NORMAL | DI_COMPAT);
}
BITMAPFILEHEADER bh;
ZeroMemory(&bh,sizeof(bh));
bh.bfOffBits=sizeof(BITMAPFILEHEADER)+nBISize;
bh.bfSize=bh.bfOffBits+lpbmih->biSizeImage;
bh.bfType=0x4d42;
HANDLE hFile=INVALID_HANDLE_VALUE;
__try
{
HANDLE hFile=CreateFile(L"Desktop.bmp",GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwBytesWritten=0;
if(!WriteFile(hFile,&bh,sizeof(bh),&dwBytesWritten,NULL))
__leave;
if(!WriteFile(hFile,lpbmi,nBISize,&dwBytesWritten,NULL))
__leave;
if(!WriteFile(hFile,m_lpvFullBits,lpbmi->bmiHeader.biSizeImage,&dwBytesWritten,NULL))
__leave;
}
__finally
{
if(hFile!=INVALID_HANDLE_VALUE)
CloseHandle(hFile);
SelectObject(hMemDC,hOldObject);
DeleteDC(hMemDC);
ReleaseDC(NULL,hDC);
DeleteObject(lpbitmap);
DeleteObject(hBmp);
delete [] lpbmi;
}
}