网上的Windows环境下截屏的源代码很多,但是看到的都是只能适应单显示器,无法截取桌面扩展到双显示器情况下的完整屏幕。过查找资料和摸索,发现问题的关键就在于正确获得截屏的长宽尺寸。通常,计算屏幕实际大小可以用:
HWND hWnd = GetDesktopWindow();
RECT re;
GetWindowRect(window, &re);
int width = re.right, height = re.bottom;
上面的代码可以获得单显示器缩放比例100%情况下的屏幕分辨率,但这只是虚尺寸,所以若是用户将屏幕缩放比例设置为超出100%,则会导致截屏区域的宽和高计算出错,因而无法截取到完整的屏幕。代码得改成如下所示:
void getPhysicalResolution(int& width, int& height)
{
// 获取窗口当前显示的监视器
// 使用桌面的句柄.
HWND hWnd = GetDesktopWindow();
HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
// 获取监视器逻辑宽度与高度
MONITORINFOEX miex;
miex.cbSize = sizeof(miex);
GetMonitorInfo(hMonitor, &miex);
// 获取监视器物理宽度与高度
DEVMODE dm;
dm.dmSize = sizeof(dm);
dm.dmDriverExtra = 0;
EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm);
width = dm.dmPelsWidth;
height = dm.dmPelsHeight;
}
上述代码可以不受Windows显示缩放比例的影响,获得屏幕

本文详细介绍了在Windows环境下实现多显示器截屏的技术细节,包括如何获取正确的物理分辨率,特别是当桌面扩展到双显示器时,如何计算整个桌面的分辨率,以及具体的截屏代码实现。

854

被折叠的 条评论
为什么被折叠?



