문제

I am attempting to write a program that considers Screen Bounds and if a window spans multiple screens, the window will "snap" to the closest edge of the Screen which the window has the most area in.

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);

Rectangle rct = new Rectangle();
GetWindowRect(hwnd, ref rct);

if (rct.IntersectsWith(Screen.AllScreens[0].Bounds))
{
    Rectangle hwndinterwithscreen = Rectangle.Intersect(rct, Screen.AllScreens[0].Bounds);
    MessageBox.Show("hwnd: " + hwnd.ToInt32().ToString() + " intersects with: " + Screen.AllScreens[0].DeviceName + " at: " + hwndinterwithscreen.Location + " that is this big: " + hwndinterwithscreen.Size);
}
}

With the above, I am seeing very strange results: 1) If the center of the top message bar is moved off Screen.AllScreens[0], but still overlaps with Screen.AllScreens[0], the conditional isn't entered. 2) hwndinterwithscreen.Size changes every time I move the window, and seems to be consider the closest border of Screen.AllScreens[0] in the hwndinterwithscreen calculation.

Unless I am misunderstanding what is very clear documentation on System.Drawing.Rectangle.Intersect(), something is abnormal.

Why is hwndinterwithscreen.Size reporting different numbers.

도움이 되었습니까?

해결책

You used the wrong structure Rectangle in the GetWindowRect function, you have to use the RECT structure which can be defined like this:

public struct RECT {
   public int left, top, right, bottom;
}

However, to get the Screen in which the window has the most intersection, you can try using the static method Screen.FromControl:

Screen scr = Screen.FromControl(yourForm);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top