win32 vc 阻止关机

根据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

posted on 2010-06-24 11:03 lhking 阅读(2572) 评论(1)  编辑 收藏 引用

评论

# re: win32 vc 阻止关机 2012-04-16 16:52 游客

HKEY-CURRENT-USER\Control Panel\Desktop\AutoEndTasks
即使这个键值为1
P2P终结者也能阻止关机  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜