一些软件尝尝需要截屏或是软件使用快照的功能,方便后续做一些数据对比或是校验,尤其工业软件,该文章意在记录仅使用Windows自带库实现截屏的功能。仅供参考。
同《C++实现截屏(屏幕快照)功能(一)》相比灵活性更大,可以支撑多种图片格式,只需要满足图像文件格式常量类型,不需要特意指定,直接按文件后缀即可,另外也解决了截图时只想根据某个窗口句柄来获取的问题,获取句柄的方式也比较多,这里也不再添加。有必要后续添加一篇文章。
#include "TestCaptureScreen.h"
#include <atlimage.h>
#include <string>
/*
name 保存的截图文件名称
hwnd 要截屏的窗口句柄
desx 从源上裁剪的起始x位置
desy 从源上裁剪的起始y位置
desW 截图的宽度
desH 截图的高度
*/
void CaptureScreen(std::string outName, HWND hwnd,int desx,int desy,int desW,int desH)
{
hwnd = hwnd == NULL ? GetDesktopWindow(): hwnd;//若为NULL,默认获取桌面的
HDC hDc = GetDC(hwnd);
//函数功能:该函数检索指定设备的设备指定信息。
//BITSPIXEL:像素相连颜色位数;
int bitOfPix = GetDeviceCaps(hDc, BITSPIXEL);
//int desW = GetDeviceCaps(hDc, HORZRES);
//int desH = GetDeviceCaps(hDc, VERTRES);
UINT dpi = GetDpiForWindow(hwnd);
float scale;
switch(dpi) {
case 96:
scale = 1;
break;
case 120:
scale = 1.25;
break;
case 144:
scale = 1.5;
break;
case 192:
scale = 2;
break;
case 216:
scale = 2.25;
break;
default:
scale = 1;
break;
}
desW *= scale;
desH *= scale;
CImage image;
image.Create(desW, desH, bitOfPix);
BitBlt(image.GetDC(), 0, 0, desW, desH, hDc, desx, desy,SRCCOPY);
image.Save(outName.c_str());
image.ReleaseDC();
ReleaseDC(hwnd, hDc);
}
int main()
{
CaptureScreen("截图.png", NULL, 70, 0, 1000, 1000);
return 0;
}