程序关不了机,Win7下可以,XP都不行

蔡袅 2013-07-26 03:49:21
各种关机代码都试了:
1,
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0011://WM_QUERYENDSESSION
bExitApp = true;
m.Result = (IntPtr)1;
break;
default:
base.WndProc(ref m);
break;
}
}
private void FrmMsgMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (bExitApp)
{
e.Cancel = false;
this.Close();
}
else
{
e.Cancel = true;
this.Hide();
}
}

2,监控系统关机在处理也没用
SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
...全文
484 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
蔡袅 2013-07-30
  • 打赏
  • 举报
回复
现在关机的时候可以退出我的程序了,可是每次要关机两次操作才能完全关成功,是什么原因? 代码如下:
        const int WM_ENDSESSION = 0x0016;
        const int WM_QUERYENDSESSION = 0x0011;
        /// <summary>
        /// 询问是否关机(false否关机,true是关机)
        /// </summary>
        bool bQueryExitApp = false;
        #region 关机代码
        /// <summary>
        /// 操作系统关闭时,关闭应用程序
        /// </summary>
        /// <param name="m">截获系统消息</param>
        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_QUERYENDSESSION://WM_QUERYENDSESSION
                    bQueryExitApp = true;
                    break;
                case WM_ENDSESSION://WM_ENDSESSION 系统指示:关掉
                    {
                        bQueryExitApp = true;
                        this.notifyJasic.Visible = false;
                        this.notifyJasic.Dispose();
                        this.tmRefreshDBSX.Enabled = false;
                        this.tmRefreshDBSX.Dispose();
                        KillSendImageThread();
                        KillRefreshThread();
                        CloseAllOpenForm();
                        try
                        {
                            this.Close();
                        }
                        catch (Exception ex)
                        {
                            Environment.Exit(-1);
                        }
                        Application.Exit();
                    }
                    break;
                default:
                    break;
            }
            base.WndProc(ref m);
        }

        private void FrmMsgMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!bQueryExitApp)
            {
                e.Cancel = true;
                this.Hide();
            }
        }
ericyeon 2013-07-29
  • 打赏
  • 举报
回复
用管理员身份运行
走你_ 2013-07-28
  • 打赏
  • 举报
回复
引用 28 楼 u010202504 的回复:
[quote=引用 25 楼 beyond789654 的回复:] [quote=引用 11 楼 u010202504 的回复:] 楼主 加了线程或者timer控件之类的或者重新定义了启动窗体的closing事件吧? 正好最近我也遇到过类似问题,XP系统的内存回收机制太烂才会导致这样的情况发生,什么调用API捕获关机信息之类的办法我都试完了,没戏。 我的解决方法: 1:把启动窗体留空,什么都不敢,确保不会定义到closing事件(就是让closing事件干它默认该干的事,就是this.Disposed() 2:在启动窗体的closing事件里加上停止线程或者停止timer控件计时的代码,最后也别忘了加上this.Disposed() 可能比较业余,但是确实解决了。希望能帮到你。
三余[/quote] 佛剑大师 话说在这里认道友不太合适吧…[/quote]有啥不合适的 ,黄色论坛里我都认啊
  • 打赏
  • 举报
回复
引用 25 楼 beyond789654 的回复:
[quote=引用 11 楼 u010202504 的回复:] 楼主 加了线程或者timer控件之类的或者重新定义了启动窗体的closing事件吧? 正好最近我也遇到过类似问题,XP系统的内存回收机制太烂才会导致这样的情况发生,什么调用API捕获关机信息之类的办法我都试完了,没戏。 我的解决方法: 1:把启动窗体留空,什么都不敢,确保不会定义到closing事件(就是让closing事件干它默认该干的事,就是this.Disposed() 2:在启动窗体的closing事件里加上停止线程或者停止timer控件计时的代码,最后也别忘了加上this.Disposed() 可能比较业余,但是确实解决了。希望能帮到你。
三余[/quote] 佛剑大师 话说在这里认道友不太合适吧…
  • 打赏
  • 举报
回复
首先,你自己的程序需要是管理员身份运行(win7 下必需管理员身份运行)... 然后试试: 1 System.Diagnostics.Process.Start("a.bat"); // 调用 a.bat 文件, a.bat 中如下内容 shutdown.exe -s -t 10 [color=#000000]或shutdown -s -t 10 -c[/color] 2 另外.... 你可以杀掉系统进程(用NTSD)...自然就关机了...仅实验和测试用用... 参考 http://zhidao.baidu.com/question/125165811.html
qldsrx 2013-07-27
  • 打赏
  • 举报
回复
引用 18 楼 xx_mm 的回复:
这是我第一个版本就这么写了,没用,不知道什么阻止了关机,一个不该花时间解决的问题,成了每个版本都得去解决的问题
你试试在那个条件判断里面写下log日志,看看条件判断是否正确,如果正确,后面就没有任何阻止关机的代码存在了,还会阻止关机,说明是其它地方的问题。
走你_ 2013-07-27
  • 打赏
  • 举报
回复
引用 11 楼 u010202504 的回复:
楼主 加了线程或者timer控件之类的或者重新定义了启动窗体的closing事件吧? 正好最近我也遇到过类似问题,XP系统的内存回收机制太烂才会导致这样的情况发生,什么调用API捕获关机信息之类的办法我都试完了,没戏。 我的解决方法: 1:把启动窗体留空,什么都不敢,确保不会定义到closing事件(就是让closing事件干它默认该干的事,就是this.Disposed() 2:在启动窗体的closing事件里加上停止线程或者停止timer控件计时的代码,最后也别忘了加上this.Disposed() 可能比较业余,但是确实解决了。希望能帮到你。
三余
  • 打赏
  • 举报
回复
如果有软件阻止关机有软件硬要关机不知道听谁的了 2013年07月27日→星座:狮子座 二〇一三年六月二十 癸巳〖蛇〗己未月甲午日己巳时 今属:木;五行:水火土木;缺:金。 纳音五行:长流水。
hubro 2013-07-27
  • 打赏
  • 举报
回复
引用 9 楼 xx_mm 的回复:
引用 5 楼 u011096386 的回复:
[quote=引用 4 楼 xx_mm 的回复:] [quote=引用 3 楼 xx_mm 的回复:] 杯具了,说错了,是程序阻止了电脑关机,怎么关都不行
找了很多原因就是管不了。。
什么程序阻止关机? 你的程序[/quote]一个通讯软件,基于TCP的[/quote] 你需要把线程在窗体关闭事件里停掉

protected override void WndProc(ref Message m)
        {
                switch (m.Msg)
                {
                    case 0x0011://WM_QUERYENDSESSION
                        bExitApp = true;
                        //在这里加上销毁线程的代码
                        m.Result = (IntPtr)1;
                        break;
                    default:
                        base.WndProc(ref m);
                        break;
                }
        }
原理同这个贴子 http://bbs.csdn.net/topics/390529220
  • 打赏
  • 举报
回复
引用 15 楼 xx_mm 的回复:
[quote=引用 13 楼 u010202504 的回复:] [quote=引用 12 楼 xx_mm 的回复:] 程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
我也是试了很多次,这种原因 第一:主要是要利用timer或者线程来循环检查版本或者任务计划时间之类的,然后程序运行过程中又不可能关掉线程或者停止timer计时,就会导致XP系统无法回收释放线程占用的内存,导致关机不能。 第二:启动窗体的closing事件被重新定义,就是托盘程序,一般我们都希望启动窗体又能启动托盘程序,也能在上面加空间实现某些功能,这样就需要把closing事件定义掉,这样也会造成关机不能。[/quote]你说的第一点是不是关机时将Timer禁用掉,同时释放掉,第二点 什么是Closing事件被重新定义?[/quote] 对,第一点就是关机时无法释放循环中的线程和timer资源导致无法关机,需要再窗体Closing事件中加上释放资源的语句。例如timer.Stop() 第二个,窗体的Closing事件默认是执行窗体的资源释放任务,就是窗体的this.Diposed(),如果为了让点击窗体关闭按钮而不关闭窗体就重新把Closing事件定义成只执行窗体的this.Hide(),就会导致关机时窗体无法执行this.Diposed(),也就无法释放窗体资源,当然就关闭不了系统了。所以尽量不要重新定义程序启动窗体的Closing事件,不过目前我只发现在XP下会出现这种屎一样的bug。 另外,由于XP系统的尿性,所以不光是上面说到的两种情况,尽量在代码中实现窗体,线程,网络ping,数据库连接等类似对象的自我释放资源,否则很难保证会不会有哪个对象资源释放不了导致关闭不了系统。
倒退一天 2013-07-27
  • 打赏
  • 举报
回复
我滴神,你自己做的程序,可疑的地方你都排查不出来?至少你得说出自己认为几个可疑的地方,别人才好帮你分析呀,就这么一两介绍,估计只有神才能帮你了.
蔡袅 2013-07-26
  • 打赏
  • 举报
回复
引用 17 楼 qldsrx 的回复:
if (e.CloseReason == CloseReason.UserClosing)
{
    e.Cancel = true;
    this.Hide();
    return;
}
这段代码我在XP、WIN2003、WIN7都试过,没任何问题,你说的CloseReason.WindowsShutDown我没去试,但是这里只需要判断是CloseReason.UserClosing才需要隐藏,其它各种理由都可以直接关闭。
这是我第一个版本就这么写了,没用,不知道什么阻止了关机,一个不该花时间解决的问题,成了每个版本都得去解决的问题
qldsrx 2013-07-26
  • 打赏
  • 举报
回复
if (e.CloseReason == CloseReason.UserClosing)
{
    e.Cancel = true;
    this.Hide();
    return;
}
这段代码我在XP、WIN2003、WIN7都试过,没任何问题,你说的CloseReason.WindowsShutDown我没去试,但是这里只需要判断是CloseReason.UserClosing才需要隐藏,其它各种理由都可以直接关闭。
蔡袅 2013-07-26
  • 打赏
  • 举报
回复
引用 14 楼 dongxinxi 的回复:
switch (m.Msg) { case 0x0011://WM_QUERYENDSESSION bExitApp = true; m.Result = (IntPtr)1; Environment.Exit(1); //强退或者Application.ExitThread();
这个代码试了,没一点用
蔡袅 2013-07-26
  • 打赏
  • 举报
回复
引用 13 楼 u010202504 的回复:
[quote=引用 12 楼 xx_mm 的回复:] 程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
我也是试了很多次,这种原因 第一:主要是要利用timer或者线程来循环检查版本或者任务计划时间之类的,然后程序运行过程中又不可能关掉线程或者停止timer计时,就会导致XP系统无法回收释放线程占用的内存,导致关机不能。 第二:启动窗体的closing事件被重新定义,就是托盘程序,一般我们都希望启动窗体又能启动托盘程序,也能在上面加空间实现某些功能,这样就需要把closing事件定义掉,这样也会造成关机不能。[/quote]你说的第一点是不是关机时将Timer禁用掉,同时释放掉,第二点 什么是Closing事件被重新定义?
  • 打赏
  • 举报
回复
switch (m.Msg) { case 0x0011://WM_QUERYENDSESSION bExitApp = true; m.Result = (IntPtr)1; Environment.Exit(1); //强退或者Application.ExitThread();
  • 打赏
  • 举报
回复
引用 12 楼 xx_mm 的回复:
程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
我也是试了很多次,这种原因 第一:主要是要利用timer或者线程来循环检查版本或者任务计划时间之类的,然后程序运行过程中又不可能关掉线程或者停止timer计时,就会导致XP系统无法回收释放线程占用的内存,导致关机不能。 第二:启动窗体的closing事件被重新定义,就是托盘程序,一般我们都希望启动窗体又能启动托盘程序,也能在上面加空间实现某些功能,这样就需要把closing事件定义掉,这样也会造成关机不能。
蔡袅 2013-07-26
  • 打赏
  • 举报
回复
程序发布了16个版本了,一直没解决这个问题。只要我把我们的程序退出了,才能关机
  • 打赏
  • 举报
回复
楼主 加了线程或者timer控件之类的或者重新定义了启动窗体的closing事件吧? 正好最近我也遇到过类似问题,XP系统的内存回收机制太烂才会导致这样的情况发生,什么调用API捕获关机信息之类的办法我都试完了,没戏。 我的解决方法: 1:把启动窗体留空,什么都不敢,确保不会定义到closing事件(就是让closing事件干它默认该干的事,就是this.Disposed() 2:在启动窗体的closing事件里加上停止线程或者停止timer控件计时的代码,最后也别忘了加上this.Disposed() 可能比较业余,但是确实解决了。希望能帮到你。
蔡袅 2013-07-26
  • 打赏
  • 举报
回复
引用 6 楼 dongxinxi 的回复:
如果你是想除关机之外,取消用户关闭的行为,你可以试试

        private void FrmMsgMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Visible = false;
            if (e.CloseReason != CloseReason.WindowsShutDown)
            {
                e.Cancel = true;
            }
        }
只需这几代码就行,对于其他几种情况,你可以看一下CloseReason
之前写过,判断CloseReson试了一点用都没有,就是程序不退出
加载更多回复(9)

111,094

社区成员

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

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

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