How do I intercept a close event?

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

How do I change a window's behavior so when someone clicks the little 'X' in
the upper right corner it actually hides the dialog, instead of disposing it?
 
Hi,

In Closing event set e.Cancel to true and WindowState to
FormWindowState.Minimized.
 
One note on that though. You should first check if the computer is
being shut down, otherwise the form will not automatically be closed
and the computer will not turn off.


private void MainForm_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{
if( !Environment.HasShutdownStarted )
{
e.Cancel = true;
this.Hide();
}
}
 
I cannot get Environment.HasShutdownStarted to work.
I placed it in;
private void MainForm_Closing(object sender,
System.ComponentModel.CancelEventArgs e)

but it always returns false, even when shutting down WindowsXP prof.

I placed this MessageBox in the same routine;
MessageBox.Show(Environment.HasShutdownStarted.ToString(),"Shutting Down?");
which always returns FALSE.

I'm at a loss with how to differentiate between the User closing the app
down and Windows closing the app down

I even wrote a second very simple app and placed the
Environment.HasShutdownStarted in the form1_closing event. Still always
returns false.

I must be missing something obvious?

Tinius
 
Hi Tinius,

I think that the easiest way of capturing the close event of the form, is
in fact to capture the WM_CLOSE message that's being send to the form through
the message loop of the OS. Here's an easy way for doing that

//insert the following code inside your main form class:

const int WM_CLOSE = 16;

protected override void WndProc(ref Message m)
{
base.WndProc (ref m);

if ( WM_CLOSE == m.Msg )
{
//closing
Trace.WriteLine(Application.ExecutablePath + " is exiting !!!");
}
}

Cheers,
Branimir

Branimir Giurov
C# MVP, MCSD, MCDBA, MCT
CTO, BSH Ltd.
www.sofiadev.org
 
Hi Branimir and thanks for the suggestion

I tried what you suggested and its works fine for detecting when the User
closes the app. The WM_CLOSE is received directly after MainForm_Closing gets
executed.
I still am in the situation where I cannot find a way of determining when
the App is closed via Shutdown.

Tinius
 
How about WM_QUERYENDSESSION?

Tinius said:
Hi Branimir and thanks for the suggestion

I tried what you suggested and its works fine for detecting when the User
closes the app. The WM_CLOSE is received directly after MainForm_Closing
gets
executed.
I still am in the situation where I cannot find a way of determining when
the App is closed via Shutdown.

Tinius
 
Hi Sean and Branimir

Thanks, it works now exactly as I wanted it to.

But I'm surprised by the C# environment lacking a high level command to deal
with such a basic issue.

I previously had code in the MainForm_Closing event as I was using e.cancel
to prevent actual close down. I moved this code to the WM_CLOSE intercept,
and didn't pass on the WM_CLOSE back to the system, thus reproducing e.cancel.

I used the WM_QUERYENDSESSION to detect Windows Shutdown to do some final
tidying up.

I come from a VB background which has can detect the following 5 ways that
may be causing an app to close down.
vbFormControlMenu 0 The user chose the Close command from the Control menu
on the form.
vbFormCode 1 The Unload statement is invoked from code.
vbAppWindows 2 The current Microsoft Windows operating environment session
is ending.
vbAppTaskManager 3 The Microsoft Windows Task Manager is closing the
application.
vbFormMDIForm 4 An MDI child form is closing because the MDI form is
closing.
vbFormOwner 5 A form is closing because its owner is closing.

I see now that I can do all this by intercepting the appropriate messages
but hope that in the next C# upgrade, we will be given the high level
funtions to perform these.

Thanks once again

Tinius
 
Back
Top