110,571
社区成员
发帖
与我相关
我的任务
分享
const int WM_ENDSESSION = 0x0016;
const int WM_QUERYENDSESSION = 0x0011;
/// <summary>
/// 询问是否关机(false否关机,true是关机)
/// </summary>
bool bQueryExitApp = false;
#region 关机代码
/// <summary>
/// 操作系统关闭时,关闭应用程序
/// </summary>
/// <param name="m">截获系统消息</param>
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_QUERYENDSESSION://WM_QUERYENDSESSION
bQueryExitApp = true;
break;
case WM_ENDSESSION://WM_ENDSESSION 系统指示:关掉
{
bQueryExitApp = true;
this.notifyJasic.Visible = false;
this.notifyJasic.Dispose();
this.tmRefreshDBSX.Enabled = false;
this.tmRefreshDBSX.Dispose();
KillSendImageThread();
KillRefreshThread();
CloseAllOpenForm();
try
{
this.Close();
}
catch (Exception ex)
{
Environment.Exit(-1);
}
Application.Exit();
}
break;
default:
break;
}
base.WndProc(ref m);
}
private void FrmMsgMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (!bQueryExitApp)
{
e.Cancel = true;
this.Hide();
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0011://WM_QUERYENDSESSION
bExitApp = true;
//在这里加上销毁线程的代码
m.Result = (IntPtr)1;
break;
default:
base.WndProc(ref m);
break;
}
}
原理同这个贴子
http://bbs.csdn.net/topics/390529220[quote=引用 13 楼 u010202504 的回复:] [quote=引用 12 楼 xx_mm 的回复:] 程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
这段代码我在XP、WIN2003、WIN7都试过,没任何问题,你说的CloseReason.WindowsShutDown我没去试,但是这里只需要判断是CloseReason.UserClosing才需要隐藏,其它各种理由都可以直接关闭。if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; this.Hide(); return; }
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Hide();
return;
}
这段代码我在XP、WIN2003、WIN7都试过,没任何问题,你说的CloseReason.WindowsShutDown我没去试,但是这里只需要判断是CloseReason.UserClosing才需要隐藏,其它各种理由都可以直接关闭。switch (m.Msg) { case 0x0011://WM_QUERYENDSESSION bExitApp = true; m.Result = (IntPtr)1; Environment.Exit(1); //强退或者Application.ExitThread();
[quote=引用 12 楼 xx_mm 的回复:] 程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
如果你是想除关机之外,取消用户关闭的行为,你可以试试只需这几代码就行,对于其他几种情况,你可以看一下CloseReasonprivate void FrmMsgMain_FormClosing(object sender, FormClosingEventArgs e) { this.Visible = false; if (e.CloseReason != CloseReason.WindowsShutDown) { e.Cancel = true; } }