jeudi, juin 28, 2007

Minimizing a window to the SysTray using C#

Step 1 : Override the close event of the form, like that after clicking on close button, the environement will not exit. Then, test session status to not block windows session closing

private const int WM_QUERYENDSESSION = 0x11;
private bool endSessionPending;

protected override void WndProc(ref Message m)
{
if (m.Msg == WM_QUERYENDSESSION)
endSessionPending = true;
base.WndProc(ref m);
}

protected override void OnClosing(CancelEventArgs e)
{
if (endSessionPending)
{
e.Cancel = false;
}
else
{
e.Cancel = true;
MinimizeInTray();
}

base.OnClosing(e);
}


Step 2 : The form will not appear on taskbar

private void MinimizeInTray()
{
this.ShowInTaskbar = false;
this.Visible = false;
this.WindowState = FormWindowState.Minimized;
}


Step 3 : Add a notify icon to the form, then you can choose to put this code on notify icon click event or to a menu item click event :

private void openForm_Click(object sender, System.EventArgs e)
{
ShowFromTray();
}

private void ShowFromTray()
{
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = true;
this.Visible = true;
}

2 commentaires:

Lamiae GHAFFOULI a dit…

ça serait bien si tu donnes un cas d'utilisation... le pk du comment :)

Sinon, ça roule ton code ;-) thks

MrFun a dit…

Bein c'est trés util de reduire ton application au Systray, pleins de cas et d'exemple : emule, flashget...
géneralement pour une application persistante, on clique sur le (x), au lieu qu'elle se ferme, elle est réduite !!