来自类库的ShowDialog(IWin32Owner)

时间:2014-02-14 08:33:42

标签: c# dialog owner

我有一个类库,它包含一个“MessageBox”等价物,还有一些铃声和口哨声。

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

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

有没有办法获取用户正在使用的当前活动表格(或至少是屏幕)?

修改

好的,这与FormStartPosition Enumeration有关。

如果我使用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();
    }

3 个答案:

答案 0 :(得分:1)

您可以使用Form.ActiveForm

  

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

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

答案 1 :(得分:1)

  

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

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

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

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

如果要模拟MessageBox.Show()用于查找所有者的行为,请编写代码,以便找到当前活动的窗口。潜在的winapi调用是GetActiveWindow()。哪个ShowDialog()已经使用,所以可能会有更多的事情发生,而不是像眼睛一样,就像一个不是Winforms窗口的活动窗口。本机MessageBox()winapi函数不介意,但ShowDialog()确实如此。使用Spy ++来诊断它。

答案 2 :(得分:0)

Form.ActiveForm仅在您的任何形式的应用程序具有焦点时才有效。因此,如果您的申请是在后台,那将毫无帮助。

请改用Application.OpenForms。检索集合中的最后一项,表示最后一个开放表单。

注意使用特殊表单属性,例如ShowInTaskBar ......它们可能不会显示在此集合中!这里描述: https://stackoverflow.com/a/3751748/2243584