限制辅助监视器中的窗口最大大小
restrict window maximum size in secondary monitor
我有一个多显示器设置。当窗口在辅助显示器上最大化时,我需要限制最大大小和位置。
在 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;
}
}
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 获取窗口监视器的唯一标识符
- 获取特定监视器的处理程序以在其中放置弹出窗口
- 限制辅助监视器中的窗口最大大小
- 错误的计数器路径,pdhAddCounter;窗口中的性能监视器
- 管理多个监视器上的多个窗口
- Qt 4.8调整窗口全分辨率监视器
- 在双显示器设置中,监视器A的全屏模式在将窗口从监视器B移动到监视器B时中断
- Win32 C++正在第二个监视器中创建窗口
- 在多个监视器上设置控制台窗口信息
- 每监视器dpi感知:黑色窗口故障与NVIDIA Optimus