Закрыть приложение windows forms

Обновлено: 04.07.2024

Когда пользователь нажимает кнопку Да, я хочу, чтобы все приложение вышло. Однако у меня есть основная форма, которая функционирует как логинформ. Когда пользователь входит в систему, основная форма скрывается и отображается другая форма.

Поэтому, когда пользователь нажимает кнопку Да, все приложение не заканчивается из-за этой скрытой формы. Как я могу убедиться,что все приложение будет закрыто?

Я попробовал Application.Exit(), это снова запускает messagebox, подтверждающий завершение работы, потому что он вызывает событие OnFormClosing.

3 ответа

У меня есть эта проблема, я написал приложение WinForms, я использую его некоторое время без каких-либо проблем. Затем я просто написал сервис windows для автоматического запуска/остановки моего приложения winforms. Но теперь окно не отображается, а в диспетчере задач оно запущено. Кроме того, для.

Как сделать так, чтобы дочерняя форма следовала за основной формой. например: откройте winform [. net2], winform открывает форму, Форма следует за основной формой, если основная форма движется.

Вы можете явно обрабатывать Application.Exit как свою собственную причину:

Это позволит вам использовать Application.Exit() для правильного завершения работы в обработчике. В качестве альтернативы вы можете просто закрыть основную (скрытую) форму напрямую.

Тростниковое решение-лучшее, если вы хотите, вы также можете попробовать это:

Похожие вопросы:

У меня есть приложение winforms, поэтому кто-то нажимает на кнопку, чтобы открыть IE для конкретного URL. Когда кто-то закрывает приложение winforms, мне нужно закрыть IE. Возможно ли это? Если да.

У меня есть приложение Eclipse, которое я хочу закрыть. Загвоздка в том, что это безголовое приложение, поэтому я не могу использовать следующий метод: PlatformUI.getWorkbench().close(); Какую.

У меня есть эта проблема, я написал приложение WinForms, я использую его некоторое время без каких-либо проблем. Затем я просто написал сервис windows для автоматического запуска/остановки моего.

Как сделать так, чтобы дочерняя форма следовала за основной формой. например: откройте winform [. net2], winform открывает форму, Форма следует за основной формой, если основная форма движется.

Я сделал проект в Visual Studio 2010 (winforms). Я сделал новую форму и хочу, чтобы эта новая форма была основной формой программы. Как я могу это изменить?

Я пытаюсь принудительно загрузить файл со строкой javascript под названием 'Proof'. Я создал скрытую форму, которая запускает действие из сценария php. Причина, по которой я не использую.

В чём же причина такого поведения? Об этом расскажу дальше. Рассмотрим открытие и закрытие форм на примерах.

Открываем и закрываем форму из другой формы

Чтобы открыть Form2 нам необходим следующий код, который будет срабатывать при нажатии на кнопку:

Теперь у нас открылась Form2 и спряталась Form1. Поработав с Form2 мы её закрываем и при этом нам надо после этого отобразить Form1. Многие начинающие, включая меня начинают писать следующий код, который помещаем в событие, которое происходит после закрытия Form2:

Вроде всё логично: Form2 закрылась, Form1 открылась. Однако используя этот метод, мы можем заметить, что после того как мы закрываем приложение оно продолжает висеть в памяти. Многие, не зная почему это происходит дописывают в метод «Form1_FormClosed» дописывают принудительное закрытие приложения:

Это работает, однако правильно ли это? Решать вам.

А теперь ответим на вопрос «почему приложение висит в памяти» и рассмотрим простое и правильное решение.

Первая часть кода: мы отображаем Form2 и скрываем Form1. Не закрываем, а именно скрываем, т.е. экземпляр Form1 продолжает существовать.

Закрыть Form1 вместо скрытия не получится, так как это главная форма приложения и при её закрытии мы закроем всё приложение.

Вторая часть кода: строкой «Form ifrm = new Form1();» мы создаём второй экземпляр Form1 и далее его и отображаем, а первый экземпляр Form1 продолжает жить в памяти. И когда мы закрываем приложение (Form1), то первый экземпляр при этом не закрываем он так и «сидит» в памяти, поэтому приложение не выгружается из памяти. В связи с этим многие и закрывают принудительно приложение при закрытии главной формы (Form1).

Сейчас мы с вами рассмотрим правильный код, который не будет создавать второй экземпляр Form1 и отображать его, а будет отображать скрытую до этого Form1.

Теперь при закрытии Form2 у нас будет вызываться и отображаться та форма, которая породила закрывающуюся.

Учитываем координаты форм при открытии

Представьте ситуацию. Открыта Form1 вы её перемещаете в правый верхний угол экрана. Потом нажимаете на кнопку и… Form2 открывается по центру экрана или в другом месте, но не в том месте, где была Form1. Многие улыбнуться и скажут, что в свойствах Form2 надо прописать/указать следующее «StartPosition -> CenterParent» и открывать Form2 следующим методом:

Form ifrm = new Form2();
ifrm.ShowDialog();

Это правильное решение, которое всегда будет открывать Form2 поверх Form1 и всегда по центру Form1. Однако этот код не применим, если вам надо скрывать Form1, так как Form1 не будет скрываться.

Сейчас приведу полное решение, которое позволит открывать Form1 и Form2 в той же точке, где находилась до этого форма, вызывающая другую форму. Код включает всё вышеописанное. В свойствах форм надо прописать следующее (прямо в студии выбираете эти значения):

Теперь вы не создаёте второго экземпляра Form1 и приложение всегда будет закрываться, не оставаясь в памяти.

Открываем форму поверх другой формы, как модальное окно

Чтобы открыть Form2 поверх Form1, как модальное окно, не скрывая Form1, вам хватит этого кода:

В итоге Form2 будет открыта поверх Form1. В этом случае пользователь не сможет переключиться на Form1 не закрыв Form2.

Я пытался, Application.Exit но он по-прежнему вызывает все дочерние окна и оповещения, и я не знаю, как использовать Environment.Exit и какое целое число вставить в него.

Кстати, всякий раз, когда мои формы вызывают событие formclosed или, form closing я закрываю приложение с помощью this.Hide() функции; Влияет ли это на поведение моего приложения сейчас?

То есть вы говорите, что скрываете только формы, а не закрываете их? Это, вероятно, причина, по которой приложение не закрывается, оно все еще имеет открытые (скрытые) формы. Тогда я должен заменить все это.Скрыть () на это. Закрыть ()? Разместите код, касающийся действий и событий Close.

Завершает этот процесс и дает базовой операционной системе указанный код выхода. Это код для вызова, когда вы используете консольное приложение.

Эта статья, Application.Exit vs. Environment.Exit , указывает на хороший совет:

В вопросе не упоминалось завершение из-за ошибки, поэтому код выхода должен быть нулевым: Environment.Exit(0) любое ненулевое значение подразумевает код ошибки конкретного приложения, который может использоваться сценарием для выполнения соответствующих действий. (Это новый код и приложение WinForms, так что в этом случае это вряд ли имеет значение, но это полезно знать всем, кто пишет инструменты командной строки.) Environment.Exit можно использовать и для применения форм. Поправьте меня, если я ошибаюсь, но я думаю, что return заявление впоследствии улучшит этот подход. Как я понял код будет продолжать выполнение после Application.Exit() до в return заявлении.

Я знаю, что это не та проблема, с которой вы столкнулись, однако еще одна причина, по которой это может произойти, заключается в том, что в вашем приложении открыт не фоновый поток.

Когда IsBackground это false будет держать вашу программу открыты до резьбы Завершает, если вы установите IsBackground на true резьбу не будет держать программу открытой. Такие вещи, как BackgroundWoker , ThreadPool и Task все внутренне используют поток с IsBackground установленным на true .

Все, что тебе нужно System.Environment.Exit(1);

И он использует системное пространство имен «using System», которое почти всегда присутствует при запуске проекта.

Его больше подходит только для консольных приложений. Следует отметить, что события FormClosing / FormClosed не будут вызываться для Environment.Exit, а также exitCode должен быть ненулевым, если произошла ошибка,

Я бы выбрал одно из следующих:

для консольного приложения (работает также на winforms).

Environment.Exit (0) также работает для WinForms, существует приложение без каких-либо исключений.

Кстати. всякий раз, когда мои формы вызывают событие formclosed или закрытия формы, я закрываю приложение с помощью функции this.Hide (). Влияет ли это на поведение моего приложения сейчас?

Если все ваше приложение всегда должно полностью завершаться всякий раз, когда ваша основная форма закрыта, вам следует просто удалить этот обработчик закрытой формы. Не отменяя это событие и просто позволяя им закрыться, когда пользователь закроет его, вы получите желаемое поведение. Что касается всех других форм, если вы не собираетесь снова показывать тот же экземпляр формы, вы просто позволяете им закрыться, вместо того, чтобы предотвращать закрытие и скрывать их. Если вы показываете их снова, то их можно скрыть.

Если вы хотите, чтобы пользователь мог щелкнуть «x» для основной формы, но оставить другую форму открытой и, по сути, стать «новой» основной формой, то это немного сложнее. В таком случае вам нужно будет просто скрыть свою основную форму, а не закрывать ее, но вам нужно будет добавить какой-то механизм, который фактически закроет основную форму, когда вы действительно хотите, чтобы ваше приложение заканчивалось. Если вы находитесь в такой ситуации, вам нужно добавить больше вопросов к вашему вопросу, описывающих, какие типы приложений должны и не должны завершать программу.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException .

Это было действительно полезно для меня, так как у меня было приложение WinForms, у которого был аргумент, чтобы он мог работать беззвучно и, следовательно, не отображал форму. Когда форма была скрыта, Application.Exit() не удалось выйти из приложения, однако Environment.Exit(1) работал как шарм. – Dib 11 August 2017 в 10:51 Вопрос не касался выхода из-за ошибки, поэтому код выхода должен быть равен нулю: Environment.Exit(0) Любое ненулевое значение предназначено для кода ошибки приложения, который может использоваться сценарием для принятия соответствующих мер. (Это новый код и приложение WinForms, поэтому вряд ли это будет иметь значение в этом случае, но полезно знать, кто пишет инструменты командной строки). – YipYip 20 June 2018 в 19:00

В этом случае наиболее подходящий способ выхода из приложения для переопределения метода onExit () в App.xaml.cs:

Я нашел это очень простым способом убить приложение, когда форма закрыта.

Но вы передаете свою основную форму для запуска, не так ли? Форма, которую вы закрываете, нажав на красный X. – LightStriker 19 October 2012 в 16:55 В этом случае, если основная форма, переданная в Run, была действительно полностью закрыта, приложение автоматически выйдет. Затем вы должны отслеживать, почему эта форма все еще открыта, запущена или скрыта где-то. – LightStriker 19 October 2012 в 16:59

Я знаю, что это не проблема, с которой вы столкнулись, однако другая причина, по которой это может произойти, заключается в том, что у вас есть нефонический поток, открытый в вашем приложении.

Когда IsBackground есть false , это будет поддерживать вашу программу открытой до тех пор, пока поток не завершится, если вы установите IsBackground на true , нить не остановит программу. Такие вещи, как BackgroundWoker , ThreadPool и Task , внутренне используют поток с IsBackground , установленным на true .

Кстати. когда мои формы называют событием закрытия формы или формы, я закрываю приложение с помощью функции this.Hide (). Это влияет на то, как сейчас работает мое приложение?

Если ваше приложение всегда должно полностью завершаться всякий раз, когда ваша основная форма закрывается, тогда вы должны просто удалить эту форму закрытым обработчиком. Не отменяя это событие и просто позволяя им закрываться, когда пользователь его закрывает, вы получите желаемое поведение. Что касается всех других форм, если вы не собираетесь снова показывать тот же самый экземпляр формы, вы просто просто закрываете их, а не предотвращаете закрытие и скрываете их. Если вы показываете их снова, то их скрытие может быть прекрасным.

Если вы хотите, чтобы пользователь нажал кнопку «x» для вашей основной формы, но оставил другую форму открытой и в эффект, становится «новой» основной формой, то это немного сложнее. В таком случае вам нужно просто скрыть свою основную форму, а не закрыть ее, но вам нужно будет добавить какой-то механизм, который фактически закрывает основную форму, когда вы действительно хотите, чтобы ваш приложение до конца. Если это та ситуация, в которой вы находитесь, вам нужно будет добавить дополнительные сведения к вашему вопросу, описывающие, какие типы приложений должны и на самом деле не должны заканчиваться.

Читайте также: