【问题标题】:Handling WM_GETMINMAXINFO for multiple monitors处理多个监视器的 WM_GETMINMAXINFO
【发布时间】:2021-11-20 15:18:02
【问题描述】:

MINMAXINFOptMaxSizeptMaxPosition 组件的 docs 说:

对于顶级窗口,此值基于 (...) 主监视器。

陈瑞峰elaborates:

如果指定的大小大于或等于主监视器的大小,则调整ptMax­Size 以包括主监视器和实际监视器之间的大小差异。 (...) 但是如果ptMax­Size 没有完全覆盖监视器,那么它的值就按原样使用。

因此,如果我想填写 MINMAXINFO 以使窗口最大化到非主监视器,在具有不同分辨率/方向的主监视器的设置中,填充工作区域,但如果这样,则不会重叠任务栏碰巧在同一台显示器上......我如何可靠地做到这一点?

ISTM 表示,一旦我获得了显示器的工作区尺寸,窗口就会打开并计算出所需的窗口最大尺寸:

  • 如果主显示器的宽度与工作区域相同或更宽,我可以不考虑宽度
  • 否则,如果窗口比它所在的显示器宽,我可以减去显示器宽度之间的差异
  • 否则,我无法描述我想要的宽度

...高度也一样。

如果我编写代码,我确实得到了所描述的行为...... 除了在显示器具有相同分辨率但方向不同的情况下,调整似乎没有得到已申请。

这一切似乎令人难以置信的复杂和奇怪。我是否遗漏或误解了什么?实际上我应该做一些简单的稳健计算吗?

【问题讨论】:

  • 这并没有经常进行测试。显示器有什么特别之处吗,比如当你旋转它时它会自动从纵向切换到横向布局?也许你不应该太担心它,这样的设置并不常见。
  • @Hans:我很想把它埋掉,但遗憾的是,我不得不担心它,因为我支持的用户有这样的设置,并且正在经历意想不到的行为。手动处理 WM_GETMINMAXINFO 大概是不寻常的,但出于乏味的原因,我们也必须这样做。大概有 something 默认消息处理程序为此做了我可以做的事情......
  • 这里任何人都可以帮助您的几率很低。使用 Microsoft 支持来解决此类棘手的问题。

标签: winapi multiple-monitors windows-messages


【解决方案1】:

在您描述的情况下,您应该能够计算出您希望窗口最大化的RECT,并且RECT 应该完全在一台显示器上(您正在谈论使用显示器或工作区监视器的边界并减少RECT,根据定义,它将完全在一个监视器上)。在这种情况下,逻辑很简单。

明确:如果所需的最大化矩形溢出目标监视器,此逻辑将不起作用。这不是 OP 的情况。

// given the HWND...
HWND hwnd = ...;

// get handles for primary and target monitor
HMONITOR hPrimaryMonitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
HMONITOR hTargetMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);

// prep primary and target monitor info structures
MONITORINFO primaryMonitorInfo { sizeof MONITORINFO };
MONITORINFO targetMonitorInfo { sizeof MONITORINFO };

// get primary and target monitor info
GetMonitorInfo(hPrimaryMonitor, &primaryMonitorInfo);
GetMonitorInfo(hTargetMonitor, &targetMonitorInfo);

// calculate your desired maximized RECT in absolute screen coordinates
RECT maximizedRect = ...;

// adjust the MINMAXINFO struct
MINMAXINFO* pMinMaxInfo = (MINMAXINFO)lParam;
pMinMaxInfo->ptMaxPosition = {
    primaryMonitorInfo.rcMonitor.left + maximizedRect.left - targetMonitorInfo.rcMonitor.left,
    primaryMonitorInfo.rcMonitor.top + maximizedRect.top - targetMonitorInfo.rcMonitor.top,
};
pMinMaxInfo->ptMaxSize = {
    maximizedRect.right - maximizedRect.left,
    maximizedRect.bottom - maximizedRect.top
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多