Louisbob
Louisbob

Reputation: 850

Position's list of windows handle on specific monitor

Currently, I'm using WinAPI in a c# project that deal with Dual-Screen configurations. My question is really simple: how to get the list of all window handle that are about 75% of their size on a specific monitor?

Best regards,

Upvotes: 0

Views: 1220

Answers (2)

Louisbob
Louisbob

Reputation: 850

Ok, I created a more generic version, that is able to use any window handle. Thank you all for your answers!

//Get the Screen object where the Hwnd handle is
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(Hwnd);

//Create rectangles object
Rectangle screenBound = screen.Bounds;
RECT handleRect = new RECT();

//Get dimensions of the Hwnd handle /!\ don't pass a Rectangle object
if (!GetWindowRect(Hwnd, ref handleRect))
{
    //ERROR
}

//Getting the intersection between the two rectangles
Rectangle handleBound = new Rectangle(handleRect.Left, handleRect.Top,                 handleRect.Right-handleRect.Left, handleRect.Bottom-handleRect.Top);

Rectangle intersection = Rectangle.Intersect(screenBound, handleBound);

//Get the area of the handle
int formArea = handleBound.Width * handleBound.Height;

//Get the area of the intersection
int intersectArea = intersection.Width * intersection.Height;

//Calculate percentage
int percentage = intersectArea * 100 / formArea;

This is the RECT structure:

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public int Left;        // x position of upper-left corner
        public int Top;         // y position of upper-left corner
        public int Right;       // x position of lower-right corner
        public int Bottom;      // y position of lower-right corner
    }

Upvotes: 0

Casperah
Casperah

Reputation: 4554

To get the screen with the largest portion of the window you can use this:

System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(form.Handle);

Then you just have to calculate how many % there is on this screen.

Rectangle screenBounds = screen.Bounds;
Rectangle formBounds = form.Bounds;


Rectangle intersection = formBounds.Intersect(screenBounds);
int formArea = formBounds.Width * formBounds.Height;
int intersectArea = intersection.Width * intersection.Height;

int percent = intersectArea * 100 / formArea;

Upvotes: 1

Related Questions