Application.Exit() and FormClosing event in Vb.net - vb.net

I have a single windows form application that is running in system tray icon.If the user press X button of the windows form a messagebox is displayed with Yes and No ( Yes ->close the form---No->keep the form running in system tray icon).
I was thinking to prevent the scenario when the user open another instance of the application when there is already an instance running so i have used this code :
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
The problem is that when i want to test this the message is displayed but after i press ok, a new messagebox appears (that one from Private Sub Form_FormClosing ).If i choose NO i will have to instance running!
I have read that Application.Exit fires the Form_FormClosing event.
Is there any possibility to cancel the triggering of the Form_FormClosing event,or am i doing something wrong?
'this is the formclosing procedure
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: I am not a programmer so please don't be to harsh with me:)

You don't need to Kill the current process or use the End Statement. If you have to use these then there is something amiss with your application.
When you want to end your application use Me.Close. This will fire the FormClosing event:
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
To stop more than one copy of your application from running use the option to Make Single Instance Application

In the situation where you are just starting your application and are testing for previous instances I have used the VB End Statement to terminate the application.
The End statement stops code execution abruptly, and does not invoke
the Dispose or Finalize method, or any other Visual Basic code. Object
references held by other programs are invalidated. If an End statement
is encountered within a Try or Catch block, control does not pass to
the corresponding Finally block.
If Process.GetProcessesByName(Process.GetCurrentProcess.ProcessName).Length> 1 Then
MessageBox.Show("Another instance is running", "Error Window", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End
End If

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
It will Close the exe from Taskbar or kill Process. If user Close the
Application from taskbar.
CloseReason.UserClosing
event will close the application if it is closed by User from
Taskber

Related

How do you bypass a FormClosing event in vb.net?

In my mdiMain, I have this code set.
Private Sub mdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
e.Cancel = IIf(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True)
End Sub
My reason for this is to catch all triggers of closing the form. Either if the user clicks the log out button, or they press the x button on the top right corner of the window, or even if they press Alt-F4. Under the FormClosed of the same MDI, there is a set of instructions after it has been confirmed to log out. My problem is I also have a process where in the user is forcibly logged out of the program. Since the user is "forced" to log out, the confirmation dialog should be bypassed. But I'm not sure how to bypass the FormClosing event, and skip directly to the FormClosed.
So far I've only come up with one way and that is to set a boolean trigger. Something like
Private Sub mdiMain_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If ForceLogOut = True Then Exit Sub
e.Cancel = IIf(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True)
End Sub
But for knowledge's sake, I would still like to hear from other people about other ways for this.
You can check the FormClosingEventArgs.CloseReason to see why the form is closing i.e. what event caused the form to close and set the cancel flag accordingly.
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Select Case e.CloseReason
Case CloseReason.TaskManagerClosing
e.Cancel = False
Case CloseReason.MdiFormClosing
e.Cancel = If(MsgBox("Closing this window will log you out. Are you sure?", MsgBoxStyle.YesNo, "Log out?") = MsgBoxResult.Yes, False, True)
'etc
End Select
End Sub
Note: You should use the IfOperator not the IIf function in VB.NET as it is type safe. You should also switch option strict on (which incidentally will not allow you to use IIf for this very reason)

Visual Basic MsgBox exiting

I created a message box which asks the user if he/she wants to close the application.
I came up with this class:
Private Sub closeAll_Click(sender As Object, e As EventArgs) Handles closeAll.Click
MsgBox("Do you want to terminate the program?", MsgBoxStyle.YesNo, "Close?")
If MsgBoxResult.Yes Then
Application.Exit()
End If
End Sub
If I select "Yes", it works fine as it exits the application successfully. But if "No" is selected, it would still close. Does it really need an "Else" statement to do so?
If it does, I don't know the proper coding for letting the program "not do something".
Can someone help?
MsgBox() is a function that returns the result (MsgBoxResult enum) so your code should be:
Private Sub closeAll_Click(sender As Object, e As EventArgs) Handles closeAll.Click
If MsgBox("Do you want to terminate the program?", MsgBoxStyle.YesNo, "Close?") = MsgBoxResult.Yes Then
Application.Exit()
End If
End Sub
The way you wrote is you take the value of enum MsgBoxResult.Yes and check if it's true. That causes an implicit conversion to a boolean value which is true since the enum value is not zero.

VB.NET - Code after Me.Close is executed

Update: Solution by #Mark Hall:
Using Exit Sub after the Me.Close to prevent further execution of the sub while the Closing event is going on..
I'm trying to open up a popup window on closing a form where the user can decide if he really wants to close the form.
Therefore I wrote:
Private Sub Form1_FormClosing_1(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
e.Cancel = True 'Fenster wird nicht geschlossen
Dim DialogExit As DialogResult
DialogExit = MsgBox("Do you want to exit the setup process?", vbQuestion Or MsgBoxStyle.OkCancel, "Exit Setup?")
Select Case DialogExit
Case Windows.Forms.DialogResult.OK
Me._Result_ThisForm = Result_Form.Yes
e.Cancel = False
Case Else
'Just no exit
End Select
End Sub
But when I call Me.Close from somewhere in the code, the form just doesn't close but it executes further code!
Like in (somewhere in the code):
If bErr = False Then
Me._Result_ThisForm = Result_Form.Goto_Next ' Just an additional info Enum
Me.Close()
End If
MsgBox("This should not pop up if bErr = false")
-> The "Exit Setup?" MsgBox pops up correctly but the user presses "ok" to exit the programm, the MessageBox from after the "Me.Close()" suddenly appers an then the program closes.
What causes this behavior?
Thank you for your help!

What is the best way to detect all ways of closing a form?

I have a form that i close using End several times in my code. I want to do a command to save settings when I do this called VarsToIni() which takes some public variables and saves them in an INI file. I have tried putting it in the main window's FormClosing (which stays open throughout) and this only works when you close from pressing the X button not from my End statement.
Add a new Sub and replace calls to End with calls to your new Sub:
Sub EndMe()
VarsToIni()
Application.Exit()
End Sub
Edit:
As Dan points out, End() is a bad way to close the application, Application.Exit() is preferred.
Consider using Application.Exit() instead of End. This allows FormClosing to be called no matter what (and you can handle it based on how it is being closed).
Private Sub frmMain_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
Select Case e.CloseReason
Case CloseReason.ApplicationExitCall
' This is the result of Application.Exit()
e.Cancel = False
Case CloseReason.UserClosing
' This is the result of clicking the red X
Select Case MessageBox.Show("Are you sure you wish to exit?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
Case DialogResult.Yes
e.Cancel = False
Case DialogResult.No
e.Cancel = True
End Select
Case Else
e.Cancel = False
End Select
If Not e.Cancel Then
VarsToIni()
End If
End Sub
I am quite confused by your question, nonetheless:
This will close all your forms
For each x as Form in My.Application.OpenForms
'You can then put your VarsToIni() here
x.Close()
Next
Note: Add this to your import
Imports System.Windows.Forms

E.cancel loop in Visual basic

I am making an server control application ( simple with some buttons to start/stop the server )
And when the user wants to close the application there will be prompted an confirm box.
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Dim response As Integer
response = MsgBox("Are you sure you want to stop the server", vbYesNo, "Stop Server ?")
If response = vbYes Then
Shell("cscript ""stop.vbs""", 1)
Close()
Else
e.Cancel = True
End If
End Sub
That is the code I have now.
But when I start the application and close it with the X button or with "Close Window" I will be prompted with the question until I click on no, then it will close.
It's a loop and it stops when you first click on yes then on no.
Can someone help me with solving this ?
Just remove the Close() call, since the Form is already closing. No need to do that.