我正在为测试小组编写一个应用程序。这个应用程序所做的是,它允许您获取屏幕任何部分的屏幕截图(然后将其上传到带有注释的测试团队服务器)。
截图包括选择屏幕上要截图的区域。为此,我创建了一个半透明窗口,并将其覆盖在整个屏幕上。我目前正在使用GetDesktopWindow()和GetWindowRect()来获取屏幕的尺寸,但这在多屏幕环境中不起作用。
如何在所有可能的屏幕上覆盖一个窗口?
屏幕配置可能非常奇特,例如:
[LCD]
[LCD][LCD][LCD](4个液晶显示屏,顶部一个,底部3个)
或
[LCD] [LCD]
[LCD][LCD][LCD]
[LCD] [LCD](7块液晶显示屏-右边3块,左边3块,中间1块)。
等。
有人知道我怎么能覆盖所有的屏幕吗?我想知道在第一个异国情调的例子中,当在左上方和右边没有屏幕时,尺寸会是什么样子?
也许我应该为每个LCD屏幕创建一个覆盖窗口?
有什么想法吗?
发布于 2013-08-07 20:09:14
您可以为此使用EnumDisplayMonitors函数。这里有一个小类,它自动构建系统中所有监视器的向量,以及它们的联合。
struct MonitorRects
{
std::vector<RECT> rcMonitors;
RECT rcCombined;
static BOOL CALLBACK MonitorEnum(HMONITOR hMon,HDC hdc,LPRECT lprcMonitor,LPARAM pData)
{
MonitorRects* pThis = reinterpret_cast<MonitorRects*>(pData);
pThis->rcMonitors.push_back(*lprcMonitor);
UnionRect(&pThis->rcCombined, &pThis->rcCombined, lprcMonitor);
return TRUE;
}
MonitorRects()
{
SetRectEmpty(&rcCombined);
EnumDisplayMonitors(0, 0, MonitorEnum, (LPARAM)this);
}
};如果您只是使用rcCombined矩形创建一个大窗口,它将覆盖所有屏幕,而“缺失”位将被系统自动裁剪掉。
发布于 2013-08-08 04:22:59
有关使用多个监视器的详细信息,请参阅MSDN:
多显示器
虚拟屏幕
多监控系统度量
您可以使用GetSystemMetrics()与SM_XVIRTUALSCREEN、SM_YVIRTUALSCREEN、SM_CXVIRTUALSCREEN和SM_CYVIRTUALSCREEN度量一起检索包含所有物理屏幕的整个虚拟屏幕的矩形。
发布于 2020-10-25 18:47:26
不,那是个虫子。负坐标是设计的一部分,如果用户将监视器移动到主监视器的0,0 (上、左)点以上,这是可以接受的,因此负坐标将适用于超出主监视器边界矩形左上方的监视器。0,0主点不是虚拟屏幕坐标引用。
https://stackoverflow.com/questions/18112616
复制相似问题