Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何获取win32 API中所有屏幕的尺寸(RECT)?_Winapi_Screen - Fatal编程技术网

Winapi 如何获取win32 API中所有屏幕的尺寸(RECT)?

Winapi 如何获取win32 API中所有屏幕的尺寸(RECT)?,winapi,screen,Winapi,Screen,我正在为测试团队写一份申请。该应用程序所做的是,它允许您拍摄屏幕任何部分的屏幕截图(然后将其上传到带有注释的测试团队服务器) 截图包括在屏幕上选择要截图的区域。为此,我创建了一个半透明窗口,并覆盖在整个屏幕上。我目前正在使用GetDesktopWindow()和GetWindowRect()获取屏幕的尺寸,但这在多屏幕环境中不起作用 如何在所有可能的屏幕上覆盖一个窗口 屏幕配置可能非常奇特,例如: [LCD] [LCD][LCD][LCD] (4个lcd屏幕-一个在顶部,3个在底部)

我正在为测试团队写一份申请。该应用程序所做的是,它允许您拍摄屏幕任何部分的屏幕截图(然后将其上传到带有注释的测试团队服务器)

截图包括在屏幕上选择要截图的区域。为此,我创建了一个半透明窗口,并覆盖在整个屏幕上。我目前正在使用
GetDesktopWindow()
GetWindowRect()
获取屏幕的尺寸,但这在多屏幕环境中不起作用

如何在所有可能的屏幕上覆盖一个窗口

屏幕配置可能非常奇特,例如:

     [LCD]
[LCD][LCD][LCD]
(4个lcd屏幕-一个在顶部,3个在底部)

(7个lcd屏幕-3个在右侧,3个在左侧,1个在中间)

等等

有人知道我如何覆盖所有屏幕上的一个窗口吗?我想知道在第一个奇异的例子中,当左、右上排没有屏幕时,尺寸会是什么样子

也许我应该为每个LCD屏幕创建一个覆盖窗口


有什么想法吗?

您可以使用
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);
    }
};
struct monitorects
{
std::向量RCM监视器;
RECT-rcombined;
静态BOOL回调MonitorEnum(HMONITOR hMon、HDC HDC、LPRECT lprcMonitor、LPARAM pData)
{
MONITORECTS*pThis=重新解释铸件(pData);
p此->rcMonitors.向后推(*lprcMonitor);
UnionRect(&pThis->rcCombined,&pThis->rcCombined,lprcMonitor);
返回TRUE;
}
monitorects()
{
SetRectEmpty(&rcCombined);
EnumDisplayMonitors(0,0,MonitorEnum,(LPARAM)this);
}
};

如果您仅使用
rcCombined
矩形创建一个大窗口,它将覆盖所有屏幕,“缺失”位将由系统自动删除。

有关使用多个监视器的详细信息,请参阅MSDN:

您可以将
GetSystemMetrics()
SM_XVIRTUALSCREEN
SM_YVIRTUALSCREEN

SM\u CXVIRTUALSCREEN
,以及
SM\u cvirtualscreen
度量,以检索包含所有物理屏幕的整个虚拟屏幕的矩形。

否,这是一个错误。负坐标是设计的一部分,如果用户将监视器移动到主监视器的0,0(顶部,左侧)点以外,则这是可以接受的,因此负坐标将适用于移动到主监视器边界矩形左侧和顶部以外的监视器。0,0主点不是虚拟屏幕坐标参考。

SM_CXVIRTUALSCREEN和SM_CYVIRTUALSCREEN似乎只给出主监视器右侧和下方的宽度和高度(从虚拟坐标0,0)。如果主显示器左侧有一个显示器,SM_XVIRTUALSCREEN将为虚拟显示原点返回正确的负值,但SM_CXVIRTUALSCREEN(至少在Windows7 SP1上)的返回值将不考虑显示器的宽度。如果是这样,则需要向Microsoft报告此错误,因为它明显违反了记录的行为。
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);
    }
};