Code:
#include "ScreenCapture.h"
HBITMAP NewBmp=NULL, OldBmp=NULL;
HDC hdcCom=NULL;
void SaveScreen(lpdds7 sfHDC)
{
HANDLE hf;
BITMAPFILEHEADER hdr;
PBITMAPINFOHEADER pbih;
LPBYTE lpBits;
DWORD dwTotal;
DWORD cb;
BYTE *hp;
DWORD dwTmp;
PBITMAPINFO pbiTest=MakeBI(sfHDC);
pbih=(PBITMAPINFOHEADER) pbiTest;
lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);
GetDIBits(hdcCom,NewBmp,0,(WORD)pbih->biHeight,lpBits,pbiTest,DIB_RGB_COLORS);
//lpwin32_find_data
WIN32_FIND_DATA finddata;
string sBitmapName;
int iFileCheck=1;
hf=FindFirstFile("screen*.bmp",&finddata);
if(hf==INVALID_HANDLE_VALUE)
{
sBitmapName="screen0.bmp";
}
else
{
while(iFileCheck)
{
iFileCheck=FindNextFile(hf,&finddata);
}
string sLastBitmapFound=finddata.cFileName;
string sFileID="";
char cID[5];
int EndOfID, ID, i;
for(i=6;i<sLastBitmapFound.size();i++)
{
if(!isdigit(sLastBitmapFound[i]))
{
EndOfID=i;
break;
}
}
for(i=6;i<EndOfID;i++)
{
sFileID+=sLastBitmapFound[i];
}
ID=atoi(sFileID.c_str());
ID++;
itoa(ID,cID,10);
sBitmapName="screen";
sBitmapName+=cID;
sBitmapName+=".bmp";
DebugLog(sBitmapName.c_str(),ID,1);
}
hf=CreateFile(sBitmapName.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
hdr.bfType=0x4d42;
hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+pbih->biSize+pbih->biClrUsed*sizeof(RGBQUAD);
WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER),(LPDWORD)&dwTmp,NULL);
WriteFile(hf,(LPVOID)pbih,sizeof(BITMAPINFOHEADER)+pbih->biClrUsed*sizeof(RGBQUAD),(LPDWORD)&dwTmp,NULL);
dwTotal=cb=pbih->biSizeImage;
hp=lpBits;
WriteFile(hf,(LPSTR)hp,(int)cb,(LPDWORD)&dwTmp,NULL);
CloseHandle(hf);
DebugLog("Scree capture recorded.",0,1);
GlobalFree((HGLOBAL)lpBits);
SelectObject(hdcCom,OldBmp);
DeleteObject(NewBmp);
NewBmp=NULL;
DeleteDC(hdcCom);
hdcCom=NULL;
}
PBITMAPINFO MakeBI(lpdds7 sfHDC)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
HDC hdc;
sfHDC->GetDC(&hdc);
NewBmp=CreateCompatibleBitmap(hdc,800,600);
hdcCom=CreateCompatibleDC(hdc);
OldBmp=(HBITMAP)SelectObject(hdcCom,NewBmp);
BitBlt(hdcCom,0,0,800,600,hdc,0,0,SRCCOPY);
sfHDC->ReleaseDC(hdc);
hdc=NULL;
GetObject(NewBmp,sizeof(BITMAP),(LPSTR)&bmp);
cClrBits=(WORD)(bmp.bmPlanes*bmp.bmBitsPixel);
if(cClrBits==1)
cClrBits=1;
else if(cClrBits<=4)
cClrBits=4;
else if(cClrBits<=8)
cClrBits=8;
else if(cClrBits<=16)
cClrBits=16;
else if(cClrBits<=24)
cClrBits=24;
else cClrBits=32;
if(cClrBits!=24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*(1<<cClrBits));
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth=bmp.bmWidth;
pbmi->bmiHeader.biHeight=bmp.bmHeight;
pbmi->bmiHeader.biPlanes=bmp.bmPlanes;
pbmi->bmiHeader.biBitCount=bmp.bmBitsPixel;
if(cClrBits<24)
pbmi->bmiHeader.biClrUsed=(1<<cClrBits);
pbmi->bmiHeader.biClrImportant=BI_RGB;
pbmi->bmiHeader.biSizeImage=((pbmi->bmiHeader.biWidth*cClrBits+31)&~31)*pbmi->bmiHeader.biHeight;
pbmi->bmiHeader.biClrImportant=0;
return(pbmi);
}