Неправильный Rectangle.Intersect(r1,r2), не сообщающий. Размер, как ожидалось
Я пытаюсь написать программу, которая считает Screen
Bounds
и если окно охватывает несколько экранов, оно "привязывается" к ближайшему краю Screen
в котором окно имеет наибольшую площадь.
[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);
}
}
С учетом вышесказанного, я вижу очень странные результаты:
1) Если центр верхней панели сообщений смещен Screen.AllScreens[0]
, но все еще совпадает с Screen.AllScreens[0]
, условное не введено.
2) hwndinterwithscreen.Size
меняется каждый раз, когда я перемещаю окно, и, кажется, рассмотреть ближайшую границу Screen.AllScreens[0]
в hwndinterwithscreen
расчет.
Если я не понимаю, что такое документация по System.Drawing.Rectangle.Intersect() очень ясно, что-то ненормальное.
Почему hwndinterwithscreen.Size
сообщать разные номера.
1 ответ
Вы использовали неправильную структуру Rectangle
в GetWindowRect
функция, вы должны использовать RECT
структура, которая может быть определена следующим образом:
public struct RECT {
public int left, top, right, bottom;
}
Тем не менее, чтобы получить Screen
в котором окно имеет наибольшее пересечение, вы можете попробовать использовать статический метод Screen.FromControl
:
Screen scr = Screen.FromControl(yourForm);