为多个监视器处理WM_GETMINMAXINFO

时间:2016-03-14 10:22:04

标签: winapi multiple-monitors windows-messages

ptMaxSize的{​​{1}}和ptMaxPosition组件的docs说:

  

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

Raymond Chen elaborates

  

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

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

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

  • 如果主监视器宽度相同或宽于工作区域,我可以单独留出宽度
  • 否则,如果窗口宽于显示器,我可以减去显示器宽度之间的差异
  • 否则,我无法描述我想要的宽度

......高度相同。

如果我对其进行编码,我确实得到了所描述的行为...... 除了,如果显示器具有相同的分辨率但方向不同,调整似乎不会得到应用。

这一切似乎令人难以置信的复杂和奇怪。我错过了什么或误解了什么?实际上我应该做一些简单的强大计算吗?

1 个答案:

答案 0 :(得分:0)

在您描述的情况下,您应该能够计算出希望窗口最大化的RECT,并且RECT应该完全在一个监视器上(您正在谈论监视器的监视器或工作空间范围,并减少RECT的范围,根据定义,// 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 }; 将完全位于一个监视器上)。在这种情况下,逻辑很容易。

要清楚:如果期望的最大矩形超出目标监视器,则此逻辑将不起作用。不是OP的情况。

state = {edit: false}