private static 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 IntPtr monitor = UnsafeNativeMethods.MonitorFromWindow(hwnd, Constants.MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { var monitorInfo = new MONITORINFO(); UnsafeNativeMethods.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); } Marshal.StructureToPtr(mmi, lParam, true); }
protected override void OnStateChanged(EventArgs e) { base.OnStateChanged(e); if (this.WindowState == WindowState.Maximized) { IntPtr monitor = UnsafeNativeMethods.MonitorFromWindow(this.Handle, Constants.MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { var monitorInfo = new MONITORINFO(); UnsafeNativeMethods.GetMonitorInfo(monitor, monitorInfo); bool ignoreTaskBar = this.IgnoreTaskbarOnMaximize; var x = ignoreTaskBar ? monitorInfo.rcMonitor.left : monitorInfo.rcWork.left; var y = ignoreTaskBar ? monitorInfo.rcMonitor.top : monitorInfo.rcWork.top; var cx = ignoreTaskBar ? monitorInfo.rcWork.right : Math.Abs(monitorInfo.rcWork.right - x); var cy = ignoreTaskBar ? monitorInfo.rcMonitor.bottom : Math.Abs(monitorInfo.rcWork.bottom - y); UnsafeNativeMethods.SetWindowPos(this.Handle, new IntPtr(-2), x, y, cx, cy, 0x0040); } } }