限制辅助监视器中的窗口最大大小

restrict window maximum size in secondary monitor

本文关键字:窗口 监视器      更新时间:2023-10-16

我有一个多显示器设置。当窗口在辅助显示器上最大化时,我需要限制最大大小和位置。

在 MSDN 中,MINMAXINFO的文档提到了以下内容:

对于具有多个监视器的系统,ptMaxSize 和 ptMaxPosition 成员描述主监视器上窗口的最大大小和位置,即使窗口最终最大化到辅助监视器上也是如此。在这种情况下,窗口管理器会调整这些值以补偿主监视器和显示窗口的监视器之间的差异。因此,如果用户不触及 ptMaxSize,则大于主监视器的监视器上的窗口将最大化为较大监视器的大小。

因此,如果nId SC_MAXIMIZE,我尝试通过OnSysCommand SetWindowPos来限制。当用户单击最大化按钮/双击标题栏时,它有效。

但是,当用户使用 Win+向上箭头键或将窗口移动到显示器顶部以最大化时,我无法处理最大化限制。

那么,是否有任何常见的地方来处理我的所有场景?

有什么方法可以做接收WM_GETMINMAXINFO消息的技巧。

我知道

这篇文章很旧,但我希望为那些仍然需要解决方案的人分享我的代码。

void CMyDialog::OnWindowPosChanging(WINDOWPOS * pos)
{
    //let us do the default processing first
    CDialogEx::OnWindowPosChanging(pos);
    //We are only interested in setting the window size when our window is in maximized state.
    //When maximized, the window will have a WS_MAIMIZE window style set
    LONG_PTR lWndStyle = GetWindowLongPtr(this->m_hWnd, GWL_STYLE);
    if ((lWndStyle & WS_MAXIMIZE) != WS_MAXIMIZE)
        return;
    //Use the proposed window from OS to identify the monitor.
    //I found that, the MonitorFromWindow() API returns primary monitor info when I restore a minimized window from taskbar.
    RECT rectWnd = {pos->x, pos->y, pos->x + pos->cx, pos->y + pos->cy};
    HMONITOR hMon = MonitorFromRect(&rectWnd, MONITOR_DEFAULTTONEAREST);
    MONITORINFO info;
    info.cbSize = sizeof(info);
    GetMonitorInfo(hMon, &info);
    LONG nMaxWndWidth = (info.rcWork.right - info.rcWork.left);
    LONG nMaxWndHeight = (info.rcWork.bottom - info.rcWork.top);
    //The window and workspace height can be > or <
    if (pos->cy != nMaxWndHeight)
    {
        pos->cy = nMaxWndHeight;
    }
    //The window and workspace width can be > or <
    if (pos->cx != nMaxWndWidth)
    {
        pos->cx = nMaxWndWidth;
    }
}