7

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

在 Windows 中,可以四处移动表单,使它们隐藏到一半。那是因为您可以将它们移动到任何监视器的实际边界之外。(进一步向左、向右或底部。)如何以简单的方式检查是否是这种情况?

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

我仍然对此并不满意。

4

2 回答 2

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
于 2013-01-17T16:26:14.130 回答
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);
    }
于 2013-01-17T21:28:20.353 回答