SetWindowPos和具有不同分辨率的多个监视器

时间:2014-04-04 22:41:34

标签: winapi multiple-monitors

我有两个以不同分辨率运行的显示器。左侧监视器为1920x1200。右侧监视器(主监视器)为1920x1080。

我想使用SetWindowPos使窗口占据左手监视器的完整垂直高度。

这就是我的所作所为:

x = GetSystemMetrics(SM_XVIRTUALSCREEN);
hMonitor = monitorFromPoint(x, 0, MONITOR_DEFAULTTONEAREST);
MONITORINFO moninfo;
moninfo.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(hMonitor, moninfo);

height = moninfo.rcWork.bottom - moninfo.rcWork.top;

SetWindowPos(hwnd, 0, moninfo.rcWork.left, moninfo.rcWord.top, width, height, SWP_NOZORDER | SWP_NOACTIVATE);

我已经确认高度计算到1200(预期b / c是目标监视器的垂直分辨率)。

但是,在调用SetWindowPos后,窗口矩形不会填满整个屏幕高度(实际上是1080高)。

我甚至在VBA中试过这个只是为了咯咯笑:

Public Sub testSWP()
    Dim hwnd As Long
    hwnd = &H1D2F2C

    SetWindowPos &H1D2F2C, 0, -1900, 0, 150, 1200, SWP_NOZORDER Or SWP_NOACTIVATE
    Dim r As RECT
    GetWindowRect hwnd, r
    ' at this point, r.bottom = 1080
End Sub

这很好(GetWindowRect文档说坐标将在客户端空间,我假设win32正在我的主显示器和辅助显示器的分辨率之间进行转换。

我准备通过目标和主要监视器的高度比率来扩大垂直维度。我很确定这会起作用,但似乎需要跳过很多环节 - 我可能只是没有意识到在客户坐标中确定屏幕尺寸的更好方法&# 39;

2 个答案:

答案 0 :(得分:2)

问题不在于坐标转换。这是Windows不允许SetWindowPos调整窗口,因此它比屏幕大。当然,它基于主显示器大小。

请参阅:Can a window be resized past the screen size/offscreen?

答案 1 :(得分:0)

您想要一个普通的窗口(带有标题栏等)还是想要一个全屏窗口(如youtube全屏视频播放或游戏)。

我认为你想要后者,即制作覆盖整个屏幕的全屏窗口。为此,在调用CreateWindow时,将WS_POPUP作为窗口样式传递(请参阅dwStyle param)。这将创建没有标题栏的窗口,它将覆盖整个屏幕。

另外,我不认为你得左左监视器的方式是正确的。您应该使用EnumMonitors遍历所有监视器,获取最左侧的监视器,然后使用GetMonitorInfo检索监视器的rects,如果您想使其成为通用应用程序。