关闭提示 & 关闭操作系统

在WinForm程序中,我们一般会在主窗体的Closing事件中添加代码,以便在用户单击关闭按钮时进行提示,或者将程序隐藏到托盘图标中。
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = false;
this.Hide();
}

随之而来的问题是,当操作系统关闭或注销时,该代码会阻止操作系统的关闭动作,如果我们的程序是一个服务型的程序,这显然是不合适的。而Framework中的 Microsoft.Win32.SystemEvents.SessionEnding 和 SessionEnded 都是在 Form.Closing 事件后触发,显然无法完成任务。那么我们还是使用Win32编程时常用的消息机制,我们知道操作系统关闭前会向所有的进程发送 WM_QUERYENDSESSION 消息,我们拦截该消息,做一个标记就行了。
private bool osShutDown = false;

protected override void WndProc(ref Message m)
{
if (m.Msg == 0x11) osShutDown = true; //WM_QUERYENDSESSION,该代码必须放在 base.WndProc (ref m); 前面。
base.WndProc (ref m);
}

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!osShutDown)
{
e.Cancel = false;
this.Hide();
}
}

--------------

还有一种更为简便的方法,就是直接处理用户单击关闭按钮的操作。
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0112 && (int)m.WParam == 0xF060) // WM_SYSCOMMAND = 0x0112, SC_CLOSE = 0xF060
{
this.Hide();
return;
}

base.WndProc(ref m);
}
[最后修改由 yuhen, 于 2006-08-11 18:39:54]

你可能感兴趣的:(操作系统)