У меня есть пользовательская реализация Windows в приложении WPF, которое перехватывает WM_GETMINMAXINFO следующим образом:
private void MaximiseWithTaskbar(System.IntPtr hwnd, System.IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO));
System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
if (monitor != System.IntPtr.Zero)
{
MONITORINFO monitorInfo = new MONITORINFO();
GetMonitorInfo(monitor, monitorInfo);
RECT rcWorkArea = monitorInfo.rcWork;
RECT rcMonitorArea = monitorInfo.rcMonitor;
mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left);
mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top);
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left);
mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top);
mmi.ptMinTrackSize.x = Convert.ToInt16(this.MinWidth * (desktopDpiX / 96));
mmi.ptMinTrackSize.y = Convert.ToInt16(this.MinHeight * (desktopDpiY / 96));
}
Marshal.StructureToPtr(mmi, lParam, true);
}
Все это работает, и это позволяет мне максимизировать окно без полей, не располагая его на панели задач, и это здорово, но на самом деле не нравится перемещаться между мониторами с помощью новых сочетаний клавиш Win7 ,
Всякий раз, когда приложение перемещается с помощью Win + Shift + Влево / Вправо, сообщение WM_GETMINMAXINFO принимается, как и следовало ожидать, но MonitorFromWindow (hwnd, MONITOR_DEFAULTTONEAREST) возвращает монитор, из которого приложение было перемещено из, а не монитор он перемещается в TO, поэтому, если мониторы имеют разное разрешение, окно будет иметь неправильный размер.
Я не уверен, что я могу вызвать что-то еще, кроме MonitorFromWindow, или есть сообщение «движущиеся мониторы», которое я могу перехватить до WM_GETMINMAXINFO. Я предполагаю, что есть способ сделать это, потому что "нормальные" окна работают просто отлично.