0

我有一个类库,其中包含一个“MessageBox”等价物,还有一些花里胡哨的东西。

如果我调用该ShowDialog(IWin32Owner)方法,则此方法有效,并且表单将显示在我的父表单的中心。

然而,有时,这个表单是从我的项目中的一个类中调用的,所以我无权访问表单所有者。在这种情况下,我可以传递null给该ShowDialog()方法,但它似乎无法识别“当前活动窗口”并将其显示在中心。我假设是因为它在另一个类库中。

那么有什么方法可以获取用户正在处理的当前活动表单(或至少是屏幕)?

编辑

好的,这更多地与 FormStartPosition 枚举有关。

如果我使用CentreScreen它,则应根据 MSDN 默认为当前活动的监视器。但是,如果表单在类库中,这似乎默认为默认监视器。

好的:

这是有问题的代码:无法将表单设置为中心屏幕:

    public static DialogResult ShowYesNoCancel(string message)
    {
        using (frmMessage form = new frmMessage())
        {
            form.Text = @"Input Required";
            form.lblMessage.Text = message;
            form.btnNo.Visible = true;
            form.btnOK.Text = @"Yes";
            form.btnOK.DialogResult = DialogResult.Yes;
            form.StartPosition = FormStartPosition.CenterScreen;
            return form.ShowDialog();
        }
    }

一个解法:

    /// <summary>
    /// Overridden to ensure its in the centre of the current screen
    /// </summary>
    /// <returns></returns>
    public new DialogResult ShowDialog()
    {
        Screen current = Screen.FromPoint(MousePosition);
        Rectangle s = current.WorkingArea;
        StartPosition = FormStartPosition.Manual;
        Location = new Point(s.Left + s.Width / 2 - Width / 2, s.Top + s.Height / 2 - Height / 2);
        return base.ShowDialog();
    }
4

3 回答 3

1

您可以使用Form.ActiveForm

获取此应用程序的当前活动表单。

但是,您的类库在不了解 UI 的情况下自行显示此消息这一事实可能不是一个好兆头。

于 2014-02-14T08:37:35.080 回答
1

这应该默认为当前活动的监视器

问题是:如果您有多个,哪个是“当前活动的监视器”?如果您有两个或更多,那么这将是一个混乱的问题,辅助显示器不会或多或少地“活跃”于主显示器,它同样能够显示窗口。

Winforms 使用的启发式方法是“显示鼠标光标的监视器”。基础调用是:

  Screen desktop = Screen.FromPoint(Control.MousePosition);

如果您想模拟 MessageBox.Show() 用于查找所有者的行为,请编写代码以查找当前活动的窗口。底层的 winapi 调用是GetActiveWindow()。ShowDialog() 已经使用了哪个,因此可能发生的事情比眼前的要多,例如不是 Winforms 窗口的活动窗口。本机 MessageBox() winapi 函数不介意,但 ShowDialog() 可以。使用 Spy++ 来诊断。

于 2014-02-14T09:38:24.423 回答
0

Form.ActiveForm仅当您的应用程序的任何形式具有焦点时才有效。因此,如果您的应用程序在后台,那将无济于事。

改为使用Application.OpenForms。检索集合中的最后一项,它表示最后一个 openend 表单。

注意特殊的表单属性,比如 ShowInTaskBar……它们可能不会出现在这个集合中!此处描述: https ://stackoverflow.com/a/3751748/2243584

于 2014-02-14T09:04:28.353 回答