C# 阻止电脑关机

根据MSDN的描述,采用如下的代码来实现阻止关机,结果发现在有的机器上能够阻止关机,在有的机器上却不能阻止(虽然能看到弹出的MessageBox,但还来不及反应,马上就关机了)。(都是WinXP SP2的机器)

[cpp]  view plain copy
  1. LRESULT CPreventShutdownDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     if (WM_QUERYENDSESSION == message)  
  4.     {  
  5.         AfxMessageBox(_T("呵呵,不许关机!"));  
  6.         return FALSE;  // 根据MSDN,WM_QUERYENDSESSION 返回FALSE则取消关机  
  7.     }  
  8.   
  9.     return CDialog::WindowProc(message, wParam, lParam);  
  10. }  

wpf实现:

app.xaml中

<Application x:Class="_7次方软件盒子.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml" SessionEnding="Application_SessionEnding">
    <Application.Resources>

 app.xaml.cs中

public partial class App : Application
    {
        private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
        {
            //Ask the user if they want to allow the session to end
            string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
            MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);

            //End session, if specified
            if (result == MessageBoxResult.No)
            {
                e.Cancel = true;
            }
            
        }
    }

是什么原因在某些机器上无法阻止关机呢?

回忆关机时经常遇到的场景:

1. 如果某个进程失去响应,关机的时候会提示"...没有响应,是否结束"

2. 使用记事本修改了文档,在没有保存的情况下进行关机,普通情况会提示是否进行保存。

 

1这种情况不好模拟,但是2是很好模拟的。于是在不能阻止关机的机器上这样进行测试,发现虽然也弹出了是否保存的对话框,但是还是马上就关机了。

 

果然,和程序无关,应该是机器设置的问题。于是想到了一个很流行的词:"快速关机"

 

到网上google了一下,发现快速关机是通过如下的方式实现的:

HKEY-CURRENT-USER/Control Panel/Desktop/AutoEndTasks  值为1表示快速关机 ,普通情况值为0或这个键值不存在

在HKEY_USERS这里面还有几处都有这个值,经过我的测试需要把这里面所有的AutoEndTasks 删掉才可以阻止关机的:

.DEFAULT
S-1-5-18
S-1-5-19

到不能阻止快速关机的机器上一看,果然这个键值为1.

改为0后再运行程序,就都能阻止关机了。

 

【结论】阻止关机需要两步才能完美的实现,而不仅仅是MSDN中描述的2)

            1) 在程序中先删除这个键值(HKEY-CURRENT-USER/Control Panel/Desktop/AutoEndTasks)

            2) 处理 WM_QUERYENDSESSION 时返回FALSE


 

ps. Vista又有一些变化 Shutdown Changes for Windows Vista


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值