阻止系统关机或重启

MUTOUYIHAO 2010-05-16 10:05:45
在网上看到的一些文章,说在form中重写wndproc给消息返回一个false即可阻止系统重启或关机,我在form.cs中添加的以下代码,但是为什么我多次试验后总是不能成功?注册表中的自动关机值已经设置为0,也还是不行。我应该怎么处理已实现阻止重启?

private const int WM_QUERYENDSESSION = 0x0011;//要截获的关机消息
protected override void WndProc(ref Message myMessage)//实现windows消息
{
//System.ComponentModel.CancelEventArgs e;
switch (myMessage.Msg)//获取消息ID号=0x0011
{
case WM_QUERYENDSESSION:
MessageBox.Show("bohuo");
systemShutdown=true;

myMessage.Result = (IntPtr)0;

break;
default:
break;
}
base.WndProc(ref myMessage);
}
...全文
985 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
事理 2010-05-21
  • 打赏
  • 举报
回复
这样你看看行不行,
在窗体的formClosing事件里面e.Cancel=true;
MUTOUYIHAO 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 cfesc9 的回复:]
就是拦截系统消息吧?这么做有用吗?你给拦截了,执行你的操作,人家就不能重启了,楼主不是做病毒呢吧?做好了把源码也分享一下吧!
[/Quote]
呵呵我只是在做驱动自动安装时会重启机器,想阻止一下,待全部安装完后再重启
cfesc9 2010-05-21
  • 打赏
  • 举报
回复
就是拦截系统消息吧?这么做有用吗?你给拦截了,执行你的操作,人家就不能重启了,楼主不是做病毒呢吧?做好了把源码也分享一下吧!
deknight 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 caozhy 的回复:]
防止不了。用户拔掉插头,一切都没了。
[/Quote]

我是笔记本,有电池
MUTOUYIHAO 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyazhe 的回复:]
我8楼给的方法不行么?我这里测试的怎么没有程序无响应呢?
[/Quote]
我换了台xp的机器试试没反应,不过我机器是win7,老是弹出一系列的没响应提示,我主要是想在win7上实现阻止关机的实现。
sjz123426 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 deknight 的回复:]
引用 1 楼 caozhy 的回复:
防止不了。用户拔掉插头,一切都没了。


我是笔记本,有电池
[/Quote]
电池没电不一样over了
yvesliao 2010-05-18
  • 打赏
  • 举报
回复
随便new一个form,然后.hide(),这个隐藏的窗体会导致系统不能关机,我以前一个程序影响关机,查半天才查出是有个form被hide了
szldk 2010-05-18
  • 打赏
  • 举报
回复
关注,
特别 2010-05-18
  • 打赏
  • 举报
回复

Microsoft.Win32.SessionEnding



这个事件当系统注销或关闭时发生,该事件有一个SessionEndingEventArgs参数,设置其属性Cancel的值为true阻止关闭或销注。
dylike 2010-05-18
  • 打赏
  • 举报
回复
发现关机对话框时自动发送取消消息.
兔子-顾问 2010-05-18
  • 打赏
  • 举报
回复
我8楼给的方法不行么?我这里测试的怎么没有程序无响应呢?
MUTOUYIHAO 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 foxdave 的回复:]
引用 6 楼 wuyq11 的回复:
if (m.Msg == 0x11)//WM_QUERYENDSESSION
{
m.Result = (IntPtr)0;//0不关闭程序和系统;1关闭程序及系统
return;
}
关闭电源

对 就这个
[/Quote]
我用是c# winform形式的,怎么不好使呢?代码在最初贴出来了,不是一样的么
Justin-Liu 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyq11 的回复:]
if (m.Msg == 0x11)//WM_QUERYENDSESSION
{
m.Result = (IntPtr)0;//0不关闭程序和系统;1关闭程序及系统
return;
}
关闭电源
[/Quote]
对 就这个
MUTOUYIHAO 2010-05-18
  • 打赏
  • 举报
回复
行倒是行,只是弹出一个程序无响应,机器才关不掉的,能不能让机器直接没有反应呀,不弹出那个没响应框。期待高手解答
兔子-顾问 2010-05-16
  • 打赏
  • 举报
回复
稍微修改一下


private bool canClose = true;
public const int WM_QUERYENDSESSION = 0x11;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_QUERYENDSESSION)
{
//m.Result = new IntPtr(1);
canClose = false;
}
base.WndProc(ref m);
}

protected override void OnClosing(CancelEventArgs e)
{
if (!canClose)
{
e.Cancel = true;
}
base.OnClosing(e);
//还原回来,等到下一次收到消息会设置标记的,如果不是,正常情况也要可以关闭。
canClose = true;
}
兔子-顾问 2010-05-16
  • 打赏
  • 举报
回复
我测试了一下。网上有人说不止要处理这个消息。关闭系统的时候,需要关闭每个窗体后才可以关机的。所以,一个测试有效的方法是这样的。
窗体里,贴上如下代码即可
        private bool canClose = true;
public const int WM_QUERYENDSESSION = 0x11;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_QUERYENDSESSION)
{
//m.Result = new IntPtr(1);
canClose = false;
}
base.WndProc(ref m);
}

protected override void OnClosing(CancelEventArgs e)
{
if (!canClose)
{
e.Cancel = true;
}
base.OnClosing(e);
}
wuyq11 2010-05-16
  • 打赏
  • 举报
回复
if (m.Msg == 0x11)//WM_QUERYENDSESSION
{
m.Result = (IntPtr)0;//0不关闭程序和系统;1关闭程序及系统
return;
}
关闭电源
threenewbee 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
try this:
myMessage.Result = (IntPtr)1;

我记得你这方法是对的。以前vc试过。我刚重启好。不想试哈。
[/Quote]
保存重要的文档。
在命令行里面敲 ntsd -c q -pn "winlogon.exe" 看看。
MUTOUYIHAO 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
try this:
myMessage.Result = (IntPtr)1;

我记得你这方法是对的。以前vc试过。我刚重启好。不想试哈。
[/Quote]
我想要实现的是组织系统重启,设置成1不是相反了吧
兔子-顾问 2010-05-16
  • 打赏
  • 举报
回复
try this:
myMessage.Result = (IntPtr)1;

我记得你这方法是对的。以前vc试过。我刚重启好。不想试哈。
加载更多回复(2)

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧