0

我正在尝试编写一个程序,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报告不同的数字。

4

1 回答 1

1

您在函数中使用了错误的结构 ,您必须使用可以这样定义结构:RectangleGetWindowRectRECT

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

但是,要获得Screen窗口最多的交叉点,您可以尝试使用静态方法Screen.FromControl

Screen scr = Screen.FromControl(yourForm);
于 2013-10-22T20:46:14.753 回答