检查Form是否在所有屏幕的范围内

时间:2013-01-17 16:22:22

标签: vb.net winforms

我正在尝试详细说明整个表单是否在屏幕上可见。澄清这一点:我不关心表单是否被其他表单部分或完全隐藏,我只想知道,如果表单完全在屏幕上。

在Windows中,可以移动表单,使其隐藏在中途。那是因为你可以将它们移过任何监视器的实际边界。 (进一步向左,向右或向下。)如何以简单的方式检查是否是这种情况?

我认为我可以做的是检查表单是否在SystemInformation.VirtualScreen的范围内。这里的问题是,并非虚拟屏幕的每个像素实际上都是可见的。当然,如果SystemInformation.MonitorCount = 1

,这将有效

我仍然对此并不满意。

2 个答案:

答案 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);
    }