我正在尝试详细说明整个表单是否在屏幕上可见。澄清这一点:我不关心表单是否被其他表单部分或完全隐藏,我只想知道,如果表单完全在屏幕上。
在Windows中,可以移动表单,使其隐藏在中途。那是因为你可以将它们移过任何监视器的实际边界。 (进一步向左,向右或向下。)如何以简单的方式检查是否是这种情况?
我认为我可以做的是检查表单是否在SystemInformation.VirtualScreen
的范围内。这里的问题是,并非虚拟屏幕的每个像素实际上都是可见的。当然,如果SystemInformation.MonitorCount = 1
我仍然对此并不满意。
答案 0 :(得分:5)
Public Function IsOnScreen(ByVal form As Form) As Boolean
Dim screens() As Screen = Screen.AllScreens
For Each scrn As Screen In screens
Dim formRectangle As Rectangle = New Rectangle(form.Left, form.Top, form.Width, form.Height)
If scrn.WorkingArea.Contains(formRectangle) Then
Return True
End If
Next
Return False
End Function
答案 1 :(得分:3)
我能想到的最佳方法是检查表单的所有四个角都在屏幕上。像这样:
public bool FormOnScreen(Form frm) {
if (frm.IsHandleCreated) throw new InvalidOperationException();
if (!frm.Visible || frm.WindowState == FormWindowState.Minimized) return false;
return PointVisible(new Point(frm.Left, frm.Top)) &&
PointVisible(new Point(frm.Right, frm.Top)) &&
PointVisible(new Point(frm.Right, frm.Bottom)) &&
PointVisible(new Point(frm.Left, frm.Bottom));
}
private static bool PointVisible(Point p) {
var scr = Screen.FromPoint(p);
return scr.Bounds.Contains(p);
}