static Rectangle GetVisibleRectangle(WindowInfo wi, Screen s)
        {
            Rectangle resultWindowRect = new Rectangle(
                wi.rcWindow.left,
                wi.rcWindow.top,
                wi.rcWindow.right - wi.rcWindow.left,
                wi.rcWindow.bottom - wi.rcWindow.top
            );

            WindowBorderOnScreenFlags flags = new WindowBorderOnScreenFlags(wi, s);

            if(!flags.leftBorderOnScreen)
                resultWindowRect.X = s.WorkingArea.X;
            else {
                resultWindowRect.X = !flags.rightBorderOnScreen ?
                    s.WorkingArea.Right - wi.rcWindow.right + wi.rcWindow.left :
                    wi.rcWindow.left;
            }

            if(!flags.topBorderOnScreen)
                resultWindowRect.Y = s.WorkingArea.Y;
            else {
                resultWindowRect.Y = !flags.bottomBorderOnScreen ?
                    s.WorkingArea.Bottom - wi.rcWindow.bottom + wi.rcWindow.top :
                    wi.rcWindow.top;
            }

            return resultWindowRect;
        }
        static Rectangle GetVisibleRectangle(WindowInfo wi, Screen s)
        {
            Rectangle resultWindowRect = new Rectangle(
                wi.rcWindow.left,
                wi.rcWindow.top,
                wi.rcWindow.right - wi.rcWindow.left,
                wi.rcWindow.bottom - wi.rcWindow.top
                );

            WindowBorderOnScreenFlags flags = new WindowBorderOnScreenFlags(wi, s);

            if (!flags.leftBorderOnScreen)
            {
                resultWindowRect.X = s.WorkingArea.X;
            }
            else
            {
                resultWindowRect.X = !flags.rightBorderOnScreen ?
                                     s.WorkingArea.Right - wi.rcWindow.right + wi.rcWindow.left :
                                     wi.rcWindow.left;
            }

            if (!flags.topBorderOnScreen)
            {
                resultWindowRect.Y = s.WorkingArea.Y;
            }
            else
            {
                resultWindowRect.Y = !flags.bottomBorderOnScreen ?
                                     s.WorkingArea.Bottom - wi.rcWindow.bottom + wi.rcWindow.top :
                                     wi.rcWindow.top;
            }

            return(resultWindowRect);
        }
        static int GetWindowVisibleArea(WindowInfo wi, Screen s)
        {
            WindowBorderOnScreenFlags flags = new WindowBorderOnScreenFlags(wi, s);

            int visibleWidth  = 0,
                visibleHeight = 0;

            if (flags.leftBorderOnScreen)
            {
                visibleWidth = flags.rightBorderOnScreen ? wi.rcWindow.right - wi.rcWindow.left : s.WorkingArea.Right - wi.rcWindow.left;
            }
            else if (flags.rightBorderOnScreen)
            {
                visibleWidth = wi.rcWindow.right - s.WorkingArea.Left;
            }

            if (flags.topBorderOnScreen)
            {
                visibleHeight = flags.bottomBorderOnScreen ? wi.rcWindow.bottom - wi.rcWindow.top : s.WorkingArea.Bottom - wi.rcWindow.top;
            }
            else if (flags.bottomBorderOnScreen)
            {
                visibleHeight = wi.rcWindow.bottom - s.WorkingArea.Top;
            }

            return(visibleWidth * visibleHeight);
        }
        static int GetWindowVisibleArea(WindowInfo wi, Screen s)
        {
            WindowBorderOnScreenFlags flags = new WindowBorderOnScreenFlags(wi, s);

            int visibleWidth = 0,
                visibleHeight = 0;

            if(flags.leftBorderOnScreen)
                visibleWidth = flags.rightBorderOnScreen ? wi.rcWindow.right - wi.rcWindow.left : s.WorkingArea.Right - wi.rcWindow.left;
            else if(flags.rightBorderOnScreen)
                visibleWidth = wi.rcWindow.right - s.WorkingArea.Left;

            if(flags.topBorderOnScreen)
                visibleHeight = flags.bottomBorderOnScreen ? wi.rcWindow.bottom - wi.rcWindow.top : s.WorkingArea.Bottom - wi.rcWindow.top;
            else if(flags.bottomBorderOnScreen)
                visibleHeight = wi.rcWindow.bottom - s.WorkingArea.Top;

            return visibleWidth * visibleHeight;
        }