我有一个类库,这个类库包含一个"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();
}
发布于 2014-02-14 09:38:24
这应该默认为当前活动的监视器。
问题是:如果您有多个活动监视器,那么哪个是“当前活动监视器”?如果您有两个或更多的,这是一个混乱的问题,一个次要监视器不是或多或少的“活动”比主要的一个,它是同样能够显示窗口。
Winforms使用的启发是“显示鼠标光标的监视器”。根本的呼吁是:
Screen desktop = Screen.FromPoint(Control.MousePosition);
如果您想模仿MessageBox.Show()用于查找所有者的行为,那么编写代码,以便它找到当前活动的窗口。底层的winapi调用是GetActiveWindow()。ShowDialog()已经使用了哪个,所以可能会发生比眼前更多的事情,比如一个非Winforms窗口的活动窗口。本机MessageBox() winapi函数不介意,但是ShowDialog()会。使用Spy++来诊断这一点。
发布于 2014-02-14 08:37:35
发布于 2014-02-14 09:04:28
只有当您的应用程序的任何形式都有焦点时,Form.ActiveForm
才能工作。因此,如果您的应用程序是背景,这将是没有帮助的。
使用Application.OpenForms
代替。检索集合中的最后一个项,它表示最后一个openend表单。
注意特殊的形式属性,比如ShowInTaskBar.他们可能不会出现在这个收藏!在这里描述:https://stackoverflow.com/a/3751748/2243584
https://stackoverflow.com/questions/21774361
复制相似问题