internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi);
public void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam) { var mmi = (MINMAXINFO) Marshal.PtrToStructure(lParam, typeof (MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor const int MONITOR_DEFAULTTONEAREST = 0x00000002; IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { if (!_max_minSet) { _maxTrack = mmi.ptMaxTrackSize; _minTrack = mmi.ptMinTrackSize; } var 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); if (_window != null) { if (_window.WindowState == WindowState.Maximized) { mmi.ptMaxTrackSize = _maxTrack; mmi.ptMinTrackSize = _minTrack; } else { // Bug Fix #13: Translate WPF scaled coordinates to screen coordinates. var windowMaxDimens = WpfToScreenPixels(new Point(_window.MaxWidth, _window.MaxHeight)); var windowMinDimens = WpfToScreenPixels(new Point(_window.MinWidth, _window.MinHeight)); mmi.ptMaxTrackSize.x = (int) windowMaxDimens.X; mmi.ptMaxTrackSize.y = (int) windowMaxDimens.Y; mmi.ptMinTrackSize.x = (int) windowMinDimens.X; mmi.ptMinTrackSize.y = (int) windowMinDimens.Y; } } } Marshal.StructureToPtr(mmi, lParam, true); }