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

时间:2013-08-07 19:54:06

标签: winapi screen

我正在为测试团队编写一个应用程序。该应用程序的作用是让您截取屏幕的任何部分(然后将其上传到带有注释的测试团队服务器)。

截屏涉及选择屏幕上的区域以截取屏幕截图。为此,我正在创建一个半透明窗口并将其覆盖整个屏幕。我目前正在使用GetDesktopWindow()GetWindowRect()来获取屏幕的尺寸,但这在多屏幕环境中无效。

如何在所有可能的屏幕上叠加窗口?

屏幕配置非常具有异国情调,例如:

     [LCD]
[LCD][LCD][LCD]

(4个液晶屏 - 一个在顶部,三个在底部)

或者

[LCD]     [LCD]
[LCD][LCD][LCD]
[LCD]     [LCD]

(7个液晶屏 - 右边3个,左边3个,中间1个)。

有谁知道如何在所有屏幕上覆盖1个窗口?我想知道在第一个异国情调的例子中,当左上方和右上方没有屏幕时尺寸会是什么样的?

也许我应该为每个液晶屏创建一个叠加窗口?

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

您可以使用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矩形创建一个大窗口,它将覆盖所有屏幕,系统会自动剪切“丢失”位。

答案 1 :(得分:2)

有关使用多台显示器的详细信息,请参阅MSDN:

Multiple Display Monitors

Virtual Screen

Multiple Monitor System Metrics

您可以将GetSystemMetrics()SM_XVIRTUALSCREENSM_YVIRTUALSCREEN一起使用, SM_CXVIRTUALSCREENSM_CYVIRTUALSCREEN指标,用于检索包含所有物理屏幕的整个虚拟屏幕的矩形。

答案 2 :(得分:0)

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