Application.Exit () и событие FormClosing в Vb.net

У меня есть приложение для одной формы Windows, которое работает в значке на панели задач. Если пользователь нажимает кнопку X формы Windows, отображается окно сообщения с Да и Нет (Да -> закрыть форму --- Нет-> сохранить форму в значке на панели задач). Я думал предотвратить сценарий, когда пользователь открывает другой экземпляр приложения, когда экземпляр уже запущен, поэтому я использовал этот код:

 If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then 
 MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK,
    MessageBoxIcon.Exclamation)
    Application.Exit()
End If

Проблема в том, что когда я хочу проверить это, отображается сообщение, но после того, как я нажимаю ОК, появляется новое окно сообщения (это из Private Sub Form_FormClosing). Если я выберу NO, мне придется запускать экземпляр! Я прочитал, что Application.Exit запускает событие Form_FormClosing.

Есть ли возможность отменить срабатывание события Form_FormClosing, или я что-то делаю не так?

'это процедура закрытия формы

Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Try
        Dim response As MsgBoxResult
        response = MsgBox("Are you sure you want to exit", CType(MsgBoxStyle.Question + MsgBoxStyle.YesNo, MsgBoxStyle), "Confirm")

        'If the user press Yes the application wil close
        'because the application remains in taskmanager after closing i decide to kill the current process
        If response = MsgBoxResult.Yes Then
            Process.GetCurrentProcess().Kill()
        ElseIf response = MsgBoxResult.No Then
            e.Cancel = True
            Me.WindowState = FormWindowState.Minimized
            Me.Hide()
            NotifyIcon1.Visible = True
        End If

PS: Я не программист, поэтому, пожалуйста, не будьте ко мне суровы :)


person Operagust    schedule 27.03.2012    source источник


Ответы (3)


Вам не нужно убивать текущий процесс или использовать оператор End. Если вам нужно их использовать, значит, с вашим приложением что-то не так.

Если вы хотите завершить приложение, используйте Me.Close. Это вызовет событие FormClosing:

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Select Case MessageBox.Show("Are you sure you want to exit?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        Case Windows.Forms.DialogResult.Yes
            'nothing to do here the form is already closing
        Case Windows.Forms.DialogResult.No
            e.Cancel = True 'cancel the form closing event
            'minimize to tray/hide etc here 
    End Select
End Sub

Чтобы остановить запуск нескольких копий вашего приложения, используйте параметр Сделать Приложение для одного экземпляра

person Matt Wilko    schedule 27.03.2012
comment
Благодарю за ответ ... Я нашел настройку в Visual Studio Properties si, также должно быть нормально использовать этот метод ... к сожалению, мне не удалось понять, почему мое приложение не закрывается из диспетчера задач после закрытия ... Вот почему я нашел это временное решение .... В основном приложение представляет собой простую форму Windows. - person Operagust; 27.03.2012

В ситуации, когда вы только запускаете свое приложение и тестируете предыдущие экземпляры, я использовал VB End Заявление о завершении приложения.

Оператор End внезапно останавливает выполнение кода и не вызывает метод Dispose или Finalize или любой другой код Visual Basic. Ссылки на объекты, хранящиеся в других программах, становятся недействительными. Если оператор End встречается в блоке Try или Catch, управление не передается соответствующему блоку finally.

If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then  
   MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK,         MessageBoxIcon.Exclamation) 
   End
End If 
person Mark Hall    schedule 27.03.2012

Private Sub main_master_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
If e.CloseReason = CloseReason.UserClosing Then
'Put you desired Code inside this! 
Msgbox("Application Closing from Taskbar") 
End If 
End Sub

Он закроет exe из панели задач или завершит процесс. Если пользователь Закройте приложение на панели задач.

CloseReason.UserClosing 

событие закроет приложение, если оно будет закрыто пользователем из Taskber

person Jasmeet    schedule 15.04.2014