Неправильный Rectangle.Intersect(r1,r2), не сообщающий. Размер, как ожидалось

Я пытаюсь написать программу, которая считает ScreenBounds и если окно охватывает несколько экранов, оно "привязывается" к ближайшему краю 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);
Другие вопросы по тегам