首页 > 编程语言 > 详细

C++ wingdi实现屏幕截图

时间:2020-04-28 20:58:23      阅读:210      评论:0      收藏:0      [点我收藏+]

直接获取当前屏幕bitmap保存成bmp图像, 使用的接口都可以在msdn查找到资料

内容参考 : https://www.cnblogs.com/cdh49/p/3558353.html

使用的gdi接口有很多参数还没搞很透彻, 有机会再补充

下面是代码, 如有疏漏, 欢迎指正

  1 #include <Windows.h>
  2 #include <stdio.h>
  3 #include <tchar.h>
  4 
  5 #pragma warning(disable:4996)
  6 
  7 #define TAG_DEV_PLAS  1
  8 #define BITS_PER_PIX  16
  9 #define NO_COLOR_TAB  0
 10 #define UNCMP_RGB     0
 11 #define H_RESOL_0     0
 12 #define V_RESOL_0     0
 13 #define ALL_COLOR     0
 14 
 15 #define MUST_ZERO     0
 16 #define TYPE_BMP      0x4D42
 17 
 18 #define FILE_HEAD     sizeof(BITMAPFILEHEADER)
 19 #define INFO_HEAD     sizeof(BITMAPINFOHEADER)
 20 #define HEAD_SIZE     sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER)
 21 
 22 bool ScreenShot(const char* szSavePath)
 23 {
 24   //显示器屏幕
 25   //HDC hCurrScreen = GetDC(NULL);
 26   HDC hCurrScreen = CreateDC(_T("display"),NULL,NULL,NULL);
 27 
 28   //创建一个兼容的DC,在内存中表示当前位图的上下文
 29   HDC hCmpDC = CreateCompatibleDC(hCurrScreen);
 30 
 31   //宽高
 32   int iScreenWidth  = GetDeviceCaps(hCurrScreen, HORZRES);
 33   int iScreenHeight = GetDeviceCaps(hCurrScreen, VERTRES);
 34 
 35   //当前屏幕位图
 36   HBITMAP hBmp = CreateCompatibleBitmap(hCurrScreen, iScreenWidth, iScreenHeight);
 37 
 38   //用当前位图句柄表示内存中屏幕位图上下文
 39   SelectObject(hCmpDC,hBmp);
 40 
 41   //将当前屏幕图像复制到内存中
 42   BOOL ret = BitBlt(hCmpDC, 0, 0, iScreenWidth, iScreenHeight, hCurrScreen, 0, 0, SRCCOPY);
 43 
 44   //BMP图像信息头
 45   BITMAPINFOHEADER hBmpInfo;
 46                    hBmpInfo.biSize          = INFO_HEAD;
 47                    hBmpInfo.biWidth         = iScreenWidth;
 48                    hBmpInfo.biHeight        = iScreenHeight;
 49                    hBmpInfo.biPlanes        = TAG_DEV_PLAS;
 50                    hBmpInfo.biClrUsed       = NO_COLOR_TAB;
 51                    hBmpInfo.biBitCount      = BITS_PER_PIX;
 52                    hBmpInfo.biSizeImage     = UNCMP_RGB;
 53                    hBmpInfo.biCompression   = BI_RGB;
 54                    hBmpInfo.biClrImportant  = ALL_COLOR;
 55                    hBmpInfo.biXPelsPerMeter = H_RESOL_0;
 56                    hBmpInfo.biYPelsPerMeter = V_RESOL_0;
 57 
 58   //数据源大小
 59   DWORD dwSrcSize = ((iScreenWidth * hBmpInfo.biBitCount + 31) / 32) * 4 * iScreenHeight;
 60   
 61   //截图总大小
 62   DWORD dwPicSize = HEAD_SIZE + dwSrcSize;
 63 
 64   //BMP图像文件头
 65   BITMAPFILEHEADER hBmpFile;
 66                    hBmpFile.bfSize      = dwPicSize;
 67                    hBmpFile.bfType      = TYPE_BMP;
 68                    hBmpFile.bfOffBits   = HEAD_SIZE;
 69                    hBmpFile.bfReserved1 = MUST_ZERO;
 70                    hBmpFile.bfReserved2 = MUST_ZERO;
 71 
 72   //BMP图像数据源
 73   char *bmpSrc = new char[dwSrcSize];
 74   ZeroMemory(bmpSrc, dwSrcSize);
 75 
 76   //检索指定的兼容位图中的所有位元数据
 77   //并复制到指定格式的设备无关位图的缓存中
 78   GetDIBits(hCmpDC, hBmp, 0, (UINT)iScreenHeight, bmpSrc, (BITMAPINFO*)&hBmpInfo, DIB_RGB_COLORS);
 79 
 80   //汇总所有数据信息
 81   char *szBmp = new char[dwPicSize];
 82   ZeroMemory(szBmp, dwPicSize);
 83   memcpy(szBmp, (void*)&hBmpFile, FILE_HEAD);
 84   memcpy(szBmp + FILE_HEAD, (void*)&hBmpInfo, INFO_HEAD);
 85   memcpy(szBmp + HEAD_SIZE, bmpSrc, dwSrcSize);
 86 
 87   //保存BMP图像
 88   FILE *hFile = fopen(szSavePath, "wb+");
 89   if (nullptr != hFile)
 90   {
 91     size_t count = fwrite(szBmp, 1, dwPicSize, hFile);
 92     fclose(hFile);
 93   }
 94 
 95   //释放资源
 96   ReleaseDC(NULL, hCmpDC);
 97   ReleaseDC(NULL,hCurrScreen);
 98   delete[] szBmp;
 99   delete[] bmpSrc;
100   szBmp  = nullptr;
101   bmpSrc = nullptr;
102   return true;
103 }

 

C++ wingdi实现屏幕截图

原文:https://www.cnblogs.com/TssiNG-Z/p/12796573.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!