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

时间:2015-02-03 11:24:09

标签: c++ mfc window

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

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

  

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

因此,如果SetWindowPosOnSysCommand,我会在nIdSC_MAXIMIZE尝试限制。当用户点击最大化按钮/双击标题栏时,它可以工作。

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

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

接收WM_GETMINMAXINFO消息时是否有办法获取技巧。

1 个答案:

答案 0 :(得分:1)

我知道这篇文章已经过时了,但我希望为那些仍然需要解决方案的人分享我的代码。

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;
    }
}