2012-03-27 450 views
5

我有一個在系統托盤圖標中運行的單窗口窗體應用程序。如果用戶按窗口窗體的X按鈕,消息框顯示爲是且否(是 - >關閉表單---否 - >將表單保持在系統托盤圖標中運行)。 我想,以防止該方案,當用戶打開應用程序的另一個實例時,已經正在運行,所以我已經使用這個代碼的實例:Vb.net中的Application.Exit()和FormClosing事件

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 

的問題是,當我想測試此消息顯示,但在我按下ok後,出現一個新的消息框(來自Private Sub Form_FormClosing的一個)。如果我選​​擇否,我將不得不實例運行! 我讀過Application.Exit觸發Form_FormClosing事件。

有沒有可能取消觸發Form_FormClosing事件,或者我做錯了什麼?

「這是的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:我不是一個程序員,所以請不要在惡劣的跟我:)

回答

5

你並不需要殺死當前進程或使用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 

從運行使用選項阻止應用程序的多個副本到Make Single Instance Application

+0

感謝您的回答...我已經從Visual Studio Properties si中找到了設置,應該也可以使用此方法...不幸的是,我沒有管理爲什麼我的應用程序沒有關閉任務管理器後關閉......這就是爲什麼我找到了這個臨時解決方案....基本上應用程序是一個簡單的Windows窗體。 – Operagust 2012-03-27 14:05:51

1

在情況下,你剛開始你的應用程序並正在測試先前使用VB End聲明來終止應用程序的情況。

End語句突然停止代碼執行,並且不會調用Dispose或Finalize方法或任何其他Visual Basic代碼中的 。對象 由其他程序保存的引用無效。如果在Try或Catch塊內遇到End語句 ,則控件不會傳遞至 對應的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 
+0

大收,太感謝你了,我已經改變了它和它的工作。 – Operagust 2012-03-27 09:10:48

1
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