ダイアログを表示する前にメイン ウィンドウを非表示にしているので、その後ろにある別のウィンドウが一瞬だけ表示されます。あなたがしていることも非常に危険です。プログラムが焦点を失う可能性が非常に高いです。ダイアログを表示する前と特に表示した後の両方で、プログラムにはフォーカスを受け取ることができるウィンドウがありません。そのため、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();
}
または、メイン ウィンドウを非表示にしないでください。あまり便利ではありません。ダイアログは、モーダルであり、コピー/貼り付けを妨げているため、そのままでは十分に迷惑です。ユーザーがウィンドウを完全に見ることができないようにすると、ユーザーにとって役立つ可能性のある情報が隠されるだけです。