huidong

首页 | 会员登录 | 关于
搜索文章


注意,此文章专门解决多显示器的截屏问题。


之前我记录了村长的一个桌面截图的代码,但是不能截取多显示器的图像,如下:

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;
}


效果(缩放导致的画面模糊):



返回首页


Copyright (C) 2018-2021 huidong