我有一个类库,它包含一个“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();
}
答案 0 :(得分:1)
答案 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