好吧,你在显示对话框之前隐藏了你的主窗口,所以你会在一瞬间看到另一个窗口,无论哪个在它后面。你正在做的事情也非常冒险,你的程序失去焦点的可能性非常高。在显示对话框之前,尤其是在显示对话框之后,您的程序都没有可以接收焦点的窗口。所以Windows窗口管理器被迫寻找另一个窗口来给予焦点,它会选择另一个应用程序的窗口。强迫你在后台,如果那个窗口足够大,让它完全消失。
你需要采取反制措施。您可以通过延迟 Hide() 调用来隐藏主窗口,表单的 BeginInvoke() 方法非常方便。而且您需要确保在对话框关闭之前您的主窗口再次可见。对话框的 FormClosing 事件很方便。如果对话框已经连接事件而不是覆盖 OnFormClosing(),尽管不是 100% 可靠。
因此:
private void DisplayDialog_Click(object sender, EventArgs e) {
using (var dlg = new Form2()) {
this.BeginInvoke(new Action(() => this.Hide()));
dlg.FormClosing += dlg_FormClosing;
dlg.StartPosition = FormStartPosition.Manual;
dlg.Location = this.Location;
if (dlg.ShowDialog() == DialogResult.OK) {
// etc..
}
dlg.FormClosing -= dlg_FormClosing;
}
}
void dlg_FormClosing(object sender, FormClosingEventArgs e) {
if (!e.Cancel) this.Show();
}
或者只是不要隐藏你的主窗口。它不是很有用,对话框按原样很烦人,是模态的并防止任何复制/粘贴。阻止用户完全看到窗口只是隐藏了可能对用户有用的信息。