首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得win32 API中所有屏幕的尺寸(RECT)?

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

Stack Overflow用户
提问于 2013-08-07 19:54:06
回答 3查看 5.1K关注 0票数 6

我正在为测试小组编写一个应用程序。这个应用程序所做的是,它允许您获取屏幕任何部分的屏幕截图(然后将其上传到带有注释的测试团队服务器)。

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

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

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

代码语言:javascript
复制
     [LCD]
[LCD][LCD][LCD]

(4个液晶显示屏,顶部一个,底部3个)

代码语言:javascript
复制
[LCD]     [LCD]
[LCD][LCD][LCD]
[LCD]     [LCD]

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

等。

有人知道我怎么能覆盖所有的屏幕吗?我想知道在第一个异国情调的例子中,当在左上方和右边没有屏幕时,尺寸会是什么样子?

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

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-07 20:09:14

您可以为此使用EnumDisplayMonitors函数。这里有一个小类,它自动构建系统中所有监视器的向量,以及它们的联合。

代码语言:javascript
复制
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矩形创建一个大窗口,它将覆盖所有屏幕,而“缺失”位将被系统自动裁剪掉。

票数 9
EN

Stack Overflow用户

发布于 2013-08-08 04:22:59

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

多显示器

虚拟屏幕

多监控系统度量

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

票数 7
EN

Stack Overflow用户

发布于 2020-10-25 18:47:26

不,那是个虫子。负坐标是设计的一部分,如果用户将监视器移动到主监视器的0,0 (上、左)点以上,这是可以接受的,因此负坐标将适用于超出主监视器边界矩形左上方的监视器。0,0主点不是虚拟屏幕坐标引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18112616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档