C#如何实现阻止电脑关机???

时间:2022-09-02 20:29:13
很多软件会自动重启关闭计算机,请问用什么方法可以阻止重启、关机???

9 个解决方案

#1


给计算机发送一个阻止关机的命令。。。。。
用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\computername] [-t xx] [-c "co
mment"] [-d up:xx:yy]

        没有参数                显示此消息(与 ? 相同)
        -i                      显示 GUI 界面,必须是第一个选项
        -l                      注销(不能与选项 -m 一起使用)
        -s                      关闭此计算机
        -r                      关闭并重启动此计算机
        -a                      放弃系统关机
        -m \\computername       远程计算机关机/重启动/放弃
        -t xx                   设置关闭的超时为 xx 秒
        -c "comment"            关闭注释(最大 127 个字符)
        -f                      强制运行的应用程序关闭而没有警告
        -d [u][p]:xx:yy         关闭原因代码
                                u 是用户代码
                                p 是一个计划的关闭代码
                                xx 是一个主要原因代码(小于 256 的正整数)
                                yy 是一个次要原因代码(小于 65536 的正整数)

#2


给我点分吧.我想问问题,但是没有分了,他们高手分很多的.照顾一下新手吧..

#3


这个是倒计时这样的关机时,才能阻止的啊,我说的是如某些软件在某些时刻或者某些情况下会自动执行关机,我想的是但某个软件对系统进行关机时做中断!

#4


API Hook 拦截 ExitWindowsEx

#5


拦截消息:
WM_USERCHANGED = 0x0054; 
当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息;

public const int WM_QUERYENDSESSION = 0x11;
这个消息是关机之前发送的。很多软件拦截这个消息,然后提示用户是否保存。系统关闭之前会依次发送这个消息给当前的所有窗体,如果窗体返回true,则认为是允许关闭,如果返回False则表示不允许关机。


所以,最简单方法。重写OnWndProc,拦截WM_QUERYENDSESSION,返回false或者0即可。

因为是api。看实际情况。0也就是False。不同系统要求的返回可能有点不同。

#6


请问拦截WM_QUERYENDSESSION = 0x11消息怎么实现,写一个例子好吗?小弟初学C#~~~

#7


  private int lijie_c = 1;
        private const int vm = 0x0011;
        protected override void WndProc(ref Message SystemMessage)
        {//处理系统消息问询
            switch (SystemMessage.Msg)
            {
                case vm:
                    SystemMessage.Result = (IntPtr)lijie_c;
                    break;
                default:
                    base.WndProc(ref SystemMessage);
                    break;
            }
        }

        private void 阻止关闭计算机ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!阻止关闭计算机ToolStripMenuItem.Checked)
            {
                阻止关闭计算机ToolStripMenuItem.Checked = true;
                允许关闭计算机ToolStripMenuItem.Checked = false;
                lijie_c = 0;
                MessageBox.Show("设置成功\n    在未关闭此程序前将无法关闭计算机!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void 允许关闭计算机ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!允许关闭计算机ToolStripMenuItem.Checked)
            {
                允许关闭计算机ToolStripMenuItem.Checked = true;
                阻止关闭计算机ToolStripMenuItem.Checked = false;
                lijie_c = 1;
                MessageBox.Show("设置成功\n    已经解除阻止!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }



  希望能给你点帮助,已经把代码全部给您了!

#8


http://topic.csdn.net/u/20100626/19/f142e321-3f47-44d8-9f0a-2494df4e160d.html
     这个程序中有完整的实例!
   上面我给的代码有点小问题!不过可以实现你的需求
      在这里y有很多人帮过我,所以我也会尽我所能帮助有需要的人!
      mycllq@hotmail.com
     有任何问题我能解决的,我都可以提供帮助!

#9


   再提供你一个超级简单的解决方案!刚刚发现的!随便一个winform窗体,只要截获窗体的关闭请求。就可以实现了   实际就只需要 一行代码就可以了!
    

#1


给计算机发送一个阻止关机的命令。。。。。
用法: shutdown [-i | -l | -s | -r | -a] [-f] [-m \\computername] [-t xx] [-c "co
mment"] [-d up:xx:yy]

        没有参数                显示此消息(与 ? 相同)
        -i                      显示 GUI 界面,必须是第一个选项
        -l                      注销(不能与选项 -m 一起使用)
        -s                      关闭此计算机
        -r                      关闭并重启动此计算机
        -a                      放弃系统关机
        -m \\computername       远程计算机关机/重启动/放弃
        -t xx                   设置关闭的超时为 xx 秒
        -c "comment"            关闭注释(最大 127 个字符)
        -f                      强制运行的应用程序关闭而没有警告
        -d [u][p]:xx:yy         关闭原因代码
                                u 是用户代码
                                p 是一个计划的关闭代码
                                xx 是一个主要原因代码(小于 256 的正整数)
                                yy 是一个次要原因代码(小于 65536 的正整数)

#2


给我点分吧.我想问问题,但是没有分了,他们高手分很多的.照顾一下新手吧..

#3


这个是倒计时这样的关机时,才能阻止的啊,我说的是如某些软件在某些时刻或者某些情况下会自动执行关机,我想的是但某个软件对系统进行关机时做中断!

#4


API Hook 拦截 ExitWindowsEx

#5


拦截消息:
WM_USERCHANGED = 0x0054; 
当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体设置信息,在用户更新设置时系统马上发送此消息;

public const int WM_QUERYENDSESSION = 0x11;
这个消息是关机之前发送的。很多软件拦截这个消息,然后提示用户是否保存。系统关闭之前会依次发送这个消息给当前的所有窗体,如果窗体返回true,则认为是允许关闭,如果返回False则表示不允许关机。


所以,最简单方法。重写OnWndProc,拦截WM_QUERYENDSESSION,返回false或者0即可。

因为是api。看实际情况。0也就是False。不同系统要求的返回可能有点不同。

#6


请问拦截WM_QUERYENDSESSION = 0x11消息怎么实现,写一个例子好吗?小弟初学C#~~~

#7


  private int lijie_c = 1;
        private const int vm = 0x0011;
        protected override void WndProc(ref Message SystemMessage)
        {//处理系统消息问询
            switch (SystemMessage.Msg)
            {
                case vm:
                    SystemMessage.Result = (IntPtr)lijie_c;
                    break;
                default:
                    base.WndProc(ref SystemMessage);
                    break;
            }
        }

        private void 阻止关闭计算机ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!阻止关闭计算机ToolStripMenuItem.Checked)
            {
                阻止关闭计算机ToolStripMenuItem.Checked = true;
                允许关闭计算机ToolStripMenuItem.Checked = false;
                lijie_c = 0;
                MessageBox.Show("设置成功\n    在未关闭此程序前将无法关闭计算机!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void 允许关闭计算机ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!允许关闭计算机ToolStripMenuItem.Checked)
            {
                允许关闭计算机ToolStripMenuItem.Checked = true;
                阻止关闭计算机ToolStripMenuItem.Checked = false;
                lijie_c = 1;
                MessageBox.Show("设置成功\n    已经解除阻止!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }



  希望能给你点帮助,已经把代码全部给您了!

#8


http://topic.csdn.net/u/20100626/19/f142e321-3f47-44d8-9f0a-2494df4e160d.html
     这个程序中有完整的实例!
   上面我给的代码有点小问题!不过可以实现你的需求
      在这里y有很多人帮过我,所以我也会尽我所能帮助有需要的人!
      mycllq@hotmail.com
     有任何问题我能解决的,我都可以提供帮助!

#9


   再提供你一个超级简单的解决方案!刚刚发现的!随便一个winform窗体,只要截获窗体的关闭请求。就可以实现了   实际就只需要 一行代码就可以了!