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