Более менее крупные приложения пишутся с использованием нескольких форм, рассмотрим такое приложение: У него 3 формы: Первая (auth) отвечает за окно авторизации, пока не авторизуешься, во вторую форму попасть не можешь Вторая форма (startForm) - главные функции программы, например, это у нас клиент для лолза, то второй формой у нас будет показ форума. Третья форма (check_access) показывает простой баннер загрузки программы или проверка, авторизован ли пользователь. При старте программы необходимо показать третью форму, чтобы проверить, вошел ли пользователь в свой аккаунт. Начинаем с Program.cs, идём в метод Main, в самый конец пишем открытие третьей формы, она у нас названа как check_access: Application.Run(new check_access()); Код Application.Run(new check_access()); Не забудьте из этого метода Main убрать код, отвечающий за запуск других форм, может быть примерно такой: new auth_form().Show(); Код new auth_form().Show(); Form _auth_form = new auth_form(); _auth_form.Show(); Код Form _auth_form = new auth_form(); _auth_form.Show(); Переходим к третьей форме. Я надеюсь, что вы умеете пользоваться BackgroundWorker для написания фонового потока, если нет, то позже напишу мануал про него. Итак, в конструкторе формы check_access (третья форма) запускаем наш бекграундворкер: backgroundWorker1.RunWorkerAsync(); Код backgroundWorker1.RunWorkerAsync(); Должно получиться примерно следующее (на лишний код не обращайте внимание, это пример из живого проекта): В backgroundWorker_Work соответственно пишем код для проверки лицензии, я его рассматривать не буду, перейдем к backgroundWorker_RunWorkerCompleted, программа переходит к данному событию, когда выполниться весь код в backgroundWorker_Work Здесь легкая проверка на ответ сервера: if (sR.message == "Access is exists") { this.Hide(); new startForm().Show(); } else { this.Hide(); new auth().Show(); } Код if (sR.message == "Access is exists") { this.Hide(); new startForm().Show(); } else { this.Hide(); new auth().Show(); } Если условие истинно, то мы сворачиваем форму check_access и запускаем главную форму startForm, иначе открываем "форму для авторизации" - auth Представим, оказалось, что юзер у нас не авторизован был при проверке в форме check_access или вовсе ваше приложение будет всегда открываться с показа формы для авторизации. Пользователь входит в аккаунт, форма для авторизации сворачивается, а главная форма открывается. Хорошо, вроде работает. Юзер захотел выйти из аккаунта, что будем делать, если у нас уже создан экземпляр формы auth? Не создавать же новую форму и открывать ее... На помощь приходит метод Application.OpenForms, который покажет, какие экземпляры форм уже созданы, получив коллекцию экземпляров форм, можно ими управлять (изменять свойства, скрывать, открывать): Переходим к событию, когда пользователь кликнул на кнопку "Выйти из аккаунта": FormCollection formCollection = Application.OpenForms; foreach (Form form in formCollection) { if (form.Name == "auth") { form.Show(); } } this.Hide(); Код FormCollection formCollection = Application.OpenForms; foreach (Form form in formCollection) { if (form.Name == "auth") { form.Show(); } } this.Hide(); Здесь мы получаем коллекцию открытых форм, которые можно прокрутить через цикл foreach. В теле цикла проверяем, если название формы равно auth, то мы показываем ее, а в самом конце скрываем главную форму startForm с помощью метода this.Hide() Когда пользователь авторизовался можно использовать этот же метод и открыть главную форму: FormCollection formCollection = Application.OpenForms; foreach (Form form in formCollection) { if (form.Name == "startForm") { form.Show(); } } this.Hide(); Код FormCollection formCollection = Application.OpenForms; foreach (Form form in formCollection) { if (form.Name == "startForm") { form.Show(); } } this.Hide();