Application.Exit () и событие FormClosing в Vb.net - PullRequest
5 голосов
/ 27 марта 2012

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

 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). Если я выберу НЕТ, мне придется запустить экземпляр!Я прочитал, что 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: я не программист, поэтому, пожалуйста, не будьте со мной резкими:)

Ответы [ 3 ]

5 голосов
/ 27 марта 2012

Вам не нужно убивать текущий процесс или использовать оператор 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

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

1 голос
/ 15 апреля 2014
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

1 голос
/ 27 марта 2012

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

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

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