多显示器电脑桌面截图问题(获取多个显示器的总宽高、显示器起始坐标)
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】EasyX
[
14 瀏覽
0 評論
4 贊
5 踩
]
概要
正文
注意,此文章专门解决多显示器的截屏问题。
之前我记录了村长的一个桌面截图的代码,但是不能截取多显示器的图像,如下:
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; }
效果(缩放导致的画面模糊):