根据MSDN的描述,采用如下的代码来实现阻止关机,结果发现在有的机器上能够阻止关机,在有的机器上却不能阻止(虽然能看到弹出的MessageBox,但还来不及反应,马上就关机了)。(都是WinXP SP2的机器)
view plaincopy to clipboardprint?
LRESULT CPreventShutdownDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (WM_QUERYENDSESSION == message)
{
AfxMessageBox(_T("呵呵,不许关机!"));
return FALSE; // 根据MSDN,WM_QUERYENDSESSION 返回FALSE则取消关机
}
return CDialog::WindowProc(message, wParam, lParam);
}
LRESULT CPreventShutdownDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (WM_QUERYENDSESSION == message)
{
AfxMessageBox(_T("呵呵,不许关机!"));
return FALSE; // 根据MSDN,WM_QUERYENDSESSION 返回FALSE则取消关机
}
return CDialog::WindowProc(message, wParam, lParam);
}
是什么原因在某些机器上无法阻止关机呢?
回忆关机时经常遇到的场景:
1. 如果某个进程失去响应,关机的时候会提示"...没有响应,是否结束"
2. 使用记事本修改了文档,在没有保存的情况下进行关机,普通情况会提示是否进行保存。
1这种情况不好模拟,但是2是很好模拟的。于是在不能阻止关机的机器上这样进行测试,发现虽然也弹出了是否保存的对话框,但是还是马上就关机了。
果然,和程序无关,应该是机器设置的问题。于是想到了一个很流行的词:"快速关机"
到网上google了一下,发现快速关机是通过如下的方式实现的:
HKEY-CURRENT-USER\Control Panel\Desktop\AutoEndTasks 值为1表示快速关机
普通情况值为0或这个键值不存在
到不能阻止快速关机的机器上一看,果然这个键值为1.
改为0后再运行程序,就都能阻止关机了。
【结论】阻止关机需要两步才能完美的实现,而不仅仅是MSDN中描述的2)
1) 在程序中先删除这个键值(HKEY-CURRENT-USER\Control Panel\Desktop\AutoEndTasks)
2) 处理 WM_QUERYENDSESSION 时返回FALSE
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skyxie/archive/2009/06/09/4255767.aspx