private static Monitorinfo MonitorInfoFromWindow(IntPtr hWnd)
        {
            var hMonitor    = NativeMethods.MonitorFromWindow(hWnd, 2);
            var monitorInfo = new Monitorinfo {
                CbSize = (uint)Marshal.SizeOf(typeof(Monitorinfo))
            };

            NativeMethods.GetMonitorInfo(hMonitor, ref monitorInfo);
            return(monitorInfo);
        }
        private static Minmaxinfo AdjustWorkingAreaForAutoHide(IntPtr monitor, Minmaxinfo mmi)
        {
            var hwnd = NativeMethods.FindWindow("Shell_TrayWnd", null);
            var monitorWithTaskBar = NativeMethods.MonitorFromWindow(hwnd, MonitorDefaulttonearest);

            if (!monitor.Equals(monitorWithTaskBar))
            {
                return(mmi);
            }
            var abd = new Appbardata();

            abd.cbSize = Marshal.SizeOf(abd);
            abd.hWnd   = hwnd;
            NativeMethods.SHAppBarMessage((int)AbMsg.AbmGettaskbarpos, ref abd);
            var uEdge    = GetEdge(abd.rc);
            var autoHide = Convert.ToBoolean(NativeMethods.SHAppBarMessage((int)AbMsg.AbmGetstate, ref abd));

            if (!autoHide)
            {
                return(mmi);
            }

            switch (uEdge)
            {
            case (int)AbEdge.AbeLeft:
                mmi.ptMaxPosition.X  += 2;
                mmi.ptMaxTrackSize.X -= 2;
                mmi.ptMaxSize.X      -= 2;
                break;

            case (int)AbEdge.AbeRight:
                mmi.ptMaxSize.X      -= 2;
                mmi.ptMaxTrackSize.X -= 2;
                break;

            case (int)AbEdge.AbeTop:
                mmi.ptMaxPosition.Y  += 2;
                mmi.ptMaxTrackSize.Y -= 2;
                mmi.ptMaxSize.Y      -= 2;
                break;

            case (int)AbEdge.AbeBottom:
                mmi.ptMaxSize.Y      -= 2;
                mmi.ptMaxTrackSize.Y -= 2;
                break;

            default:
                return(mmi);
            }
            return(mmi);
        }
        private void WnGetMinMaxInfo(IntPtr hwnd, IntPtr lparam)
        {
            var mmi     = (Minmaxinfo)Marshal.PtrToStructure(lparam, typeof(Minmaxinfo));
            var monitor = NativeMethods.MonitorFromWindow(hwnd, MonitorDefaulttonearest);

            if (monitor != IntPtr.Zero)
            {
                var monitorInfo = new MonitorInfo();
                NativeMethods.GetMonitorInfo(monitor, monitorInfo);
                var rcWorkArea    = monitorInfo.rcWork;
                var 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 = (int)MinWidth;  //minimum drag X size for the window
                mmi.ptMinTrackSize.Y = (int)MinHeight; //minimum drag Y size for the window

                mmi = AdjustWorkingAreaForAutoHide(monitor, mmi);
                //need to adjust sizing if taskbar is set to autohide
            }
            Marshal.StructureToPtr(mmi, lparam, true);
        }