关于屏幕截图的问题

0
void get_desktop(IMAGE* pimg) // 抓取桌面图像到 *pimg 对象中
{
    // 通过 Windows API 获取桌面的宽高
    int w = GetSystemMetrics(SM_CXSCREEN);
    int h = GetSystemMetrics(SM_CYSCREEN);
    Resize(pimg, w, h);
    HDC srcDC = GetDC(NULL);                            // 获取桌面 DC
    HDC dstDC = GetImageHDC(pimg);                      // 获取 IMAGE 对象的 DC
    BitBlt(dstDC, 0, 0, w, h, srcDC, 0, 0, SRCCOPY);    // 在两个 DC 之间执行图像拷贝,将桌面抓图拷贝到 IMAGE 对象里面
}

为什么这段代码在我的Win10系统下无法正常截取整个屏幕,而只是截取到了一小部分?

如果把w和h乘上2.25就可以正常截取,可是到了别的机器上又不正常了。

好像是因为Bitblt用的是逻辑宽高,而不是像素宽高?

ava
lovely_ckj

2021-4-4

1

可能是你的 win10 系统设置了缩放比例,导致获取到的像素与实际有区别。

例如,你的屏幕分辨率为 1920 x 1080,然后显示比例设置的 200%。那么默认情况下,你的程序会认为屏幕分辨率为 960 x 540。

所以,你需要创建一个不受系统统缩放设置(DPI)影响的绘图窗口。请参考:https://codebus.cn/yangw/a/dpi-awareness

ava
慢羊羊

2021-4-4

技术讨论社区