, который я затем перенесу на фронт, если есть окно, закрывающее его
Этого не должно быть, но это может произойти, если вы отобразите окно сообщения из потока в вашей программе. Окно имеет рабочий стол в качестве родителя и не имеет отношения Z-порядка с окнами в вашем пользовательском интерфейсе. И да, может легко исчезнуть за окном другого приложения, в том числе и вашего собственного.
Существует опция MessageBoxOptions, которая не отображается в Winforms, MB_TOPMOST, которая гарантирует, что окно является самым верхним. Вы бы использовали это так:
MessageBox.Show("text", "caption", MessageBoxButtons.OK,
MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
(MessageBoxOptions)0x40000); // use MB_TOPMOST
Но, безусловно, лучшее, что нужно сделать, это отобразить окно сообщения в вашей ветке пользовательского интерфейса. Используйте Control.Invoke () для этого. Таким образом, другие окна вашего приложения отключаются, и пользователь не может не заметить этот флажок.
Еще одна проблема с этим, пользователь не будет ожидать появления окна, так как оно отображается асинхронно из всего, что он делает. Это означает, что окно может быть легко удалено случайно, когда пользователь случайно нажал клавишу Enter или пробел. Или щелкнул не в том месте. С этим ничего не поделаешь.
Центрирование поля в вашем главном окне технически возможно, но сделать это сложно. Проверьте этот ответ .