直接获取当前屏幕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 }
原文:https://www.cnblogs.com/TssiNG-Z/p/12796573.html