SetWindowPos和使用不同分辨率的多个显示器

5
我有两个运行在不同分辨率的显示器,左侧显示器是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(因为这是目标显示器的垂直分辨率),但是在调用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正在分辨率和主/次监视器之间进行转换。

我准备按目标和主要监视器的高度比例扩展垂直尺寸。我相信这会起到作用,但似乎需要跳过许多障碍 - 我可能不知道确定“客户端坐标”屏幕尺寸的更好方法吗?


2
如果您已经解决了问题,您应该删除您的问题或者发布一个自我回答。将“已解决”添加到标题并不能解决SO的问题。(有关更多信息,请参见[help/self-answer]。) - Ken White
2个回答

2

0

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

我认为您想要后者,即创建一个覆盖整个屏幕的全屏窗口。为此,在调用CreateWindow时,将WS_POPUP传递给窗口样式(请参见dwStyle参数)。这将创建没有标题栏的窗口,并且它将覆盖整个屏幕。

此外,我认为您获取左侧显示器的方式不正确。如果您想将其制作为通用应用程序,则应使用EnumMonitors来迭代所有监视器,获取最左侧的监视器,然后使用GetMonitorInfo检索监视器的矩形。


不,我只是想调整一个普通窗口的大小。而且你不必使用EnumMonitors。此外,如果我知道感兴趣的监视器上的位置,MonitorFromPoint就是解决问题的方法。无论如何,问题在于Windows基于主监视器尺寸错误地强制最大化窗口大小。 - Kevin Day
好的,那我误解了你的问题。另外,关于监视器选择 - 我的建议是使您的解决方案通用于任何多监视器设置。 - Abhishek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接