【问题标题】:SetWindowPos and multiple monitors with different resolutionsSetWindowPos 和不同分辨率的多台显示器
【发布时间】:2014-05-17 10:34:44
【问题描述】:

我有两台以不同分辨率运行的显示器。左显示器为 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 正在我的主显示器和辅助显示器的分辨率之间进行转换。

我正准备按目标和主显示器的高度比来增加垂直尺寸。我很确定这会奏效,但似乎需要跳过很多障碍 - 我可能只是不知道在“客户端坐标”中确定屏幕尺寸的更好方法吗?

【问题讨论】:

  • 如果您已经解决了问题,您应该删除您的问题或发布自我回答。在标题中添加“已解决”并不是 SO 的工作方式。 (有关详细信息,请参阅 [帮助/自我回答]。)

标签: winapi multiple-monitors


【解决方案1】:

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

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

另外,我认为您获取左侧显示器的方式不正确。您应该使用 EnumMonitors 遍历所有监视器,获取最左侧的监视器,然后使用 GetMonitorInfo 检索监视器的矩形,如果您想让它成为一个通用应用程序。

【讨论】:

  • 不 - 我只是想调整一个普通窗口的大小。而且您不必使用 EnumMonitors。此外,如果我知道感兴趣的监视器上的位置,MonitorFromPoint 就是这样做的方法。无论如何,问题是窗口错误地根据主显示器尺寸强制最大窗口大小。
  • 好吧,那我误解了你的问题。此外,对于显示器选择 - 我的建议是让您的解决方案适用于任何多显示器设置。
【解决方案2】:

问题不在于坐标变换。这是窗口不允许 SetWindowPos 调整窗口,使其大于屏幕。当然,这是基于主显示器的大小。

见:Can a window be resized past the screen size/offscreen?

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2020-06-07
    相关资源
    最近更新 更多