注意,此文章专门解决多显示器的截屏问题。
之前我记录了村长的一个桌面截图的代码,但是不能截取多显示器的图像,如下:
http://huidong.xyz/index.php?mode=2&id=119
但是其实稍作修改就可以了,我查到了这篇文章:
https://blog.csdn.net/qq_21743659/article/details/107833099
我简单总结一下。
首先说一下:
其实 GetDC(NULL) 的时候已经获取到整个系统的,也就是说包含了所有显示器的图像了。
但是可能在绘制的时候从 (0,0) 坐标开始,这样就只能看见主屏幕的图像了。
实操:
1. 不需要用 EnumDisplayMonitors,太麻烦了。
2. 坐标问题
获取坐标的时候用VIRTUALSCREEN参数:
GetSystemMetrics(SM_CXVIRTUALSCREEN); 多显示器的总和宽度
GetSystemMetrics(SM_CYVIRTUALSCREEN); 多显示器的总和高度
GetSystemMetrics(SM_XVIRTUALSCREEN ); 多显示器的左上角 x 坐标
GetSystemMetrics(SM_YVIRTUALSCREEN ); 多显示器的左上角 y 坐标
注意,SM_CXVIRTUALSCREEN 等一系列宏定义需要如下头文件
#include <Windows.h>
#include <WinUser.h>
包含顺序不能错。
3. easyx 完整代码
///////////////////////////////////////////////////////
//
// 代码简介:
// 在原作者实现的桌面截图函数的基础上
// 修改而成的多扩展屏的桌面截图
//
// 编译环境:Visual Studio 2019,EasyX 20210730
//
// 原作者:yangw80 <yw80@qq.com>
// 修改者:huidong
// 最后修改:2021.10.16
//
#include <Windows.h>
#include <WinUser.h>
#include <easyx.h>
// 存储整个屏幕的大小信息(多显示器)
struct ScreenSize
{
int left; // 多显示器的左上角 x 坐标
int top; // 多显示器的左上角 y 坐标
int w; // 多显示器的总和宽度
int h; // 多显示器的总和高度
};
// 获取多显示器大小信息
ScreenSize GetScreenSize()
{
int left = GetSystemMetrics(SM_XVIRTUALSCREEN);
int top = GetSystemMetrics(SM_YVIRTUALSCREEN);
int w = GetSystemMetrics(SM_CXVIRTUALSCREEN);
int h = GetSystemMetrics(SM_CYVIRTUALSCREEN);
return { left,top,w,h };
}
// 抓取桌面图像到 *pimg 对象中
void CaptureDesktop(IMAGE* pimg)
{
ScreenSize s = GetScreenSize();
Resize(pimg, s.w, s.h);
HDC srcDC = ::GetDC(NULL);
HDC dstDC = GetImageHDC(pimg);
BitBlt(dstDC, 0, 0, s.w, s.h, srcDC, s.left, s.top, SRCCOPY);
}
// 图片拉伸
// width, height 拉伸后的图片大小
// img 原图像
void ImageToSize(int width, int height, IMAGE* img)
{
IMAGE* pOldImage = GetWorkingImage();
SetWorkingImage(img);
IMAGE temp_image(width, height);
StretchBlt(
GetImageHDC(&temp_image), 0, 0, width, height,
GetImageHDC(img), 0, 0,
getwidth(), getheight(),
SRCCOPY
);
Resize(img, width, height);
putimage(0, 0, &temp_image);
SetWorkingImage(pOldImage);
}
// 主函数
int main()
{
// 定义 IMAGE 对象
IMAGE img;
// 调用抓取桌面图像的函数
CaptureDesktop(&img);
// 创建绘图窗口
initgraph(1080, 405);
// 将图像拉伸到窗口大小
ImageToSize(getwidth(), getheight(), &img);
// 在窗口中显示 IMAGE 中保存的桌面图像
putimage(0, 0, &img);
// 按任意键退出
getmessage(EM_KEY);
closegraph();
return 0;
}
效果(缩放导致的画面模糊):