Advertisement
6_2008-2009 Graphics/ Sound #212314

A simple TakeScreenShot() Function

The purpose of this function is to simply take a screenshot of the entire screen and save it as a bitmap file.

AI

AI Summary: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.

Source Code
original-source
void TakeScreenShot(char* filename)
{
	keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
	keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
	HBITMAP h;
	
	OpenClipboard(NULL);
	h = (HBITMAP)GetClipboardData(CF_BITMAP);
	CloseClipboard();
	HDC hdc=NULL;
 FILE*  fp=NULL;
 LPVOID  pBuf=NULL;
 BITMAPINFO bmpInfo;
 BITMAPFILEHEADER bmpFileHeader;
 do
	{ 
		hdc=GetDC(NULL);
  ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
  bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); 
  if(bmpInfo.bmiHeader.biSizeImage<=0)
			bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
  if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
  {
   MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
	  break;
		}   
  bmpInfo.bmiHeader.biCompression=BI_RGB;
  GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);  
  if((fp = fopen(filename,"wb"))==NULL)
  {
	  MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
   break;
  } 
  bmpFileHeader.bfReserved1=0;
  bmpFileHeader.bfReserved2=0;
  bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
  bmpFileHeader.bfType='MB';
  bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
  fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
  fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
  fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp); 
	}
	
	while(false); 
		if(hdc)  ReleaseDC(NULL,hdc); 
  if(pBuf) free(pBuf); 
  if(fp)  fclose(fp);
}
Original Comments (3)
Recovered from Wayback Machine