Это называется "собственное окно", а не дочернее окно. Windows гарантирует, что собственное окно всегда находится поверх его владельца. Это означает, что имеет , которое должно быть свернуто, когда владелец свернут.
Winforms поддерживает смену владельца на лету. Этот пример кода работал хорошо:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private Form ownedWindow;
private void button1_Click(object sender, EventArgs e) {
if (ownedWindow != null) return;
ownedWindow = new Form2();
ownedWindow.FormClosed += delegate { ownedWindow = null; };
ownedWindow.Show(this);
}
protected override void WndProc(ref Message m) {
// Trap the minimize and restore commands
if (m.Msg == 0x0112 && ownedWindow != null) {
if (m.WParam.ToInt32() == 0xf020) ownedWindow.Owner = null;
if (m.WParam.ToInt32() == 0xf120) {
ownedWindow.Owner = this;
ownedWindow.WindowState = FormWindowState.Normal;
}
}
base.WndProc(ref m);
}
}