简单的截屏

#include <windows.h>
#include <atlimage.h>

void	SaveBitmap(char *szFilename,HBITMAP hBitmap)
{
  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,hBitmap,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,_T("Unable to Allocate Bitmap Memory"),_T("Error"),MB_OK|MB_ICONERROR);
      break;
    }

    bmpInfo.bmiHeader.biCompression=BI_RGB;
    GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf,&bmpInfo,DIB_RGB_COLORS);	

    if((fp=fopen(szFilename,"wb"))==NULL)
    {
      MessageBox(NULL,_T("Unable to Create Bitmap File"),_T("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);
}


void getAppScreenShot(const char *appName, char *saveBmpName)
{ 
  HWND hAppWnd = ::FindWindow(0, appName);
  HDC hAppDC = ::GetDC(hAppWnd);
  RECT rc;
  ::GetClientRect(hAppWnd, &rc);
  int		nWidth = rc.right - rc.left;
  int		nHeight = rc.bottom - rc.top;
  HDC		hBmpFileDC=CreateCompatibleDC(hAppDC);
  HBITMAP	hBmpFileBitmap=CreateCompatibleBitmap(hAppDC,nWidth,nHeight);
  HBITMAP hOldBitmap = (HBITMAP) SelectObject(hBmpFileDC,hBmpFileBitmap);
  BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hAppDC,0,0,SRCCOPY|CAPTUREBLT);
  SelectObject(hBmpFileDC,hOldBitmap);

  SaveBitmap(saveBmpName,hBmpFileBitmap);

  DeleteDC(hBmpFileDC);
  DeleteObject(hBmpFileBitmap);
}


int main()
{
  getAppScreenShot("计算器", "1.bmp");

  return 0;
}

你可能感兴趣的:(简单的截屏)