6

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

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

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

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

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

(4 个 LCD 屏幕 - 顶部 1 个,底部 3 个)

或者

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

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

等等。

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

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

有任何想法吗?

4

3 回答 3

9

您可以为此使用该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-07T20:09:14.787 回答
7

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

多显示器

虚拟屏幕

多监视器系统指标

您可以使用GetSystemMetrics()SM_XVIRTUALSCREENSM_YVIRTUALSCREENSM_CXVIRTUALSCREEN度量SM_CYVIRTUALSCREEN来检索包含所有物理屏幕的整个虚拟屏幕的矩形。

于 2013-08-08T04:22:59.550 回答
1

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

于 2020-10-25T18:47:26.090 回答