繁体   English   中英

替代GetWindowRect()以用于多显示器?

[英]Alternative to GetWindowRect() for multi-monitor usage?

我试图将窗体重新定位到控件的底部/右侧。

public void SetAutoLocation()
{
    Rect rect;
    GetWindowRect(referenceControl.Handle, out rect);
    Point targetPoint;
    targetPoint = new Point(rect.left, rect.top + referenceControl.Height);

    if (rect.left + referenceControl.Width - this.Width < 0) //Outside left border
    {
        targetPoint.X = 0;
    }
    else
    {
        targetPoint.X = rect.left - this.Width + referenceControl.Width;
    }
    if (targetPoint.X + this.Width > System.Windows.Forms.SystemInformation.WorkingArea.Right) //Outside right border
    {
        targetPoint.X = System.Windows.Forms.SystemInformation.WorkingArea.Right - this.Width;
    }
    else if (targetPoint.X < 0)
        targetPoint.X = 0;

    if (targetPoint.Y + this.Height > System.Windows.Forms.SystemInformation.WorkingArea.Bottom) //Outside below border
    {
        targetPoint.Y = rect.top - this.Height;
    }
    if (targetPoint.Y < 0)
    {
        targetPoint.Y = 0;
    }
    if (targetPoint.X < 0)
    {
        targetPoint.X = 0;
    }

    this.Location = targetPoint;
    this.Refresh();

}

上面的代码在单监视器显示中效果很好。 但是,当在双监视器显示中打开父窗体时,该窗体会将其自身放置在第一个监视器上,因为GetWindowRect()返回了主显示内的矩形。

因此,寻找可以在多显示器上使用的GetWindowRect()替代方法。

使用Screen类获取控件所在的监视器的WorkingArea:

    var screen = Screen.FromControl(referenceControl);
    var area = screen.WorkingArea;
    var rect = referenceControl.RectangleToScreen(
        new Rectangle(0, 0, referenceControl.Width, referenceControl.Height));
    // etc..

请注意RectangleToScreen如何可以帮助您避免必须调用GetWindowRect()。

如果您咨询MSDN,则明确声明SystemInformation.WorkingArea仅返回主监视器的信息:

WorkingArea始终返回主监视器的工作区。 如果在多显示环境中需要监视器的工作区,则可以调用Screen.GetWorkingArea的重载之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM