Ответ 1
Там есть ошибка в Windows Forms, которая делает форму исчезающей из коллекции Application.OpenForms. Это произойдет, если после создания окна назначить свойства ShowInTaskbar, FormBorderStyle, ControlBox, Min/MaximizedBox, RightToLeftLayout, HelpButton, Opacity, TransparencyKey, ShowIcon или MdiParent. Эти свойства отличаются тем, что они указаны как флаги стиля в собственном вызове CreateWindowEx(). Эта форма образца демонстрирует ошибку:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
button1.Click += button1_Click;
}
private void button1_Click(object sender, EventArgs e) {
Console.WriteLine(Application.OpenForms.Count);
this.ShowInTaskbar = !this.ShowInTaskbar;
Console.WriteLine(Application.OpenForms.Count);
}
}
Windows Forms снова вызовет CreateWindowEx(), чтобы сделать измененное свойство эффективным, передав разные флаги стилей. Уничтожение исходного окна сначала имеет побочные эффекты за пределами очень заметного мерцания, один из них заключается в том, что класс приложения теряет следы формы, так как видит, что окно исчезает. С ошибкой, что она не добавляет ее обратно при создании нового окна. Избегайте ошибок, устанавливая свойство только в конструкторе, код, который запускается до вызова CreateWindowEx(), а не в обработчиках событий.
В общем, избегайте использования OpenForms из-за этой ошибки. Дайте классу, которому необходимо отобразить окно сообщения, ссылку на экземпляр формы через его конструктор. MessageBox обычно сам определяет родительское окно правильно btw, он выберет активное окно и вернет 99% времени. Если вам нужно вызвать BeginInvoke() из рабочего потока, обязательно скопируйте SynchronizationContext.Current в свой конструктор и вызовите его метод Post() позже. Обеспечивает, чтобы ваша библиотека также работала с другими библиотеками классов GUI.